JSON 列或可为空的字段?

分享于2022年12月29日 mysql 问答
【问题标题】:JSON column or nullable fields?JSON 列或可为空的字段?
【发布时间】:2022-12-20 02:58:14
【问题描述】:

我有许多字段适用于某些行但不适用于其他行。我正在考虑制作一个 JSON 字段并将数据存储在其中,而不是制作单个字段并使它们对特定行为空。

如果我想搜索保存在 JSON 中的数据,性能会受到影响吗?是否还有其他我应该注意的问题,或者我应该为每条数据创建字段并使它们可以为空?

  • 我认为您将必须更准确地了解您的应用程序中将使用哪些数据、哪些数据
  • 存储没有性能。 查询 有表现。除非你评估它,否则你无法得到这个选择的答案 具体的 您要优化的查询。
  • 一般来说,@BillKarwin 会搜索 x = y 的字段,json 会影响性能吗?
  • 很难做出笼统的陈述。一些 JSON 搜索可以使用表达式索引进行优化,但并非所有搜索都可以。这就是为什么更具体地说明要优化的查询很重要。
  • @BillKarwin 比较整数?例如,x > 100。

【解决方案1】:

您可以使用表达式索引从 JSON 文档中提取值,然后搜索将像该列是普通列一样得到优化。

这是一个例子:

mysql> create table mytable (id serial primary key, data json);

mysql> alter table mytable 
  add index ((cast(json_unquote(json_extract(data, '$.x')) as unsigned)));

如果您在搜索中使用完全相同的表达式,那么优化器将使用索引:

mysql> explain select * from mytable 
  where cast(json_unquote(json_extract(data, '$.x')) as unsigned) > 100G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: mytable
   partitions: NULL
         type: range
possible_keys: functional_index
          key: functional_index
      key_len: 9
          ref: NULL
         rows: 1
     filtered: 100.00
        Extra: Using where

这样做的缺点是您必须在索引定义中对所需的特定字段进行硬编码。

并非所有类型的 JSON 搜索都可以通过这种方式建立索引。

【讨论】: