mysql 存储大量json_MYSQL存储JSON的最佳方式?[副本]

SELECT * FROM t1

WHERE JSON_EXTRACT(data,"$.series") IN ...

在这样的表达式或函数中使用列会破坏查询使用索引帮助优化查询的任何机会。上面显示的查询被强制执行表扫描。

关于“有效访问”的说法是误导性的。这意味着在查询检查带有JSON文档的行之后,它可以提取字段,而不必解析JSON语法的文本。但仍然需要表扫描来搜索行。换句话说,查询必须检查每一行。

打个比方,如果我在电话簿中搜索名字为“Bill”的人,我仍然必须阅读电话簿中的每一页,即使名字被突出显示,以便更快地发现他们。

MySQL 5.7允许您在表中定义一个虚拟列,然后在虚拟列上创建一个索引。

ALTER TABLE t1

ADD COLUMN series AS (JSON_EXTRACT(data, '$.series')),

ADD INDEX (series);

然后,如果您查询虚拟列,它可以使用索引并避免表扫描。

SELECT * FROM t1

WHERE series IN ...

但不必为

JSON文档中的字段只有那些您想要搜索或排序的字段。JSON中可能还有其他属性,您只需要在select列表中提取这些属性,如下所示:

SELECT JSON_EXTRACT(data, '$.series') AS series FROM t1

WHERE

当您在其他子句(JOIN、WHERE、GROUP BY、HAVING、ORDER BY)中引用列时,使用常规列比使用JSON文档中的字段更有效。

我做了一个演讲

How to Use JSON in MySQL Wrong

在2018年4月的Percona现场会议上。我将在秋季更新和重复Oracle代码一的谈话。

JSON还有其他问题。例如,在我的测试中,JSON文档所需的存储空间是存储相同数据的传统列的2-3倍。

MySQL正在大力提升其新的JSON功能,主要是为了劝阻人们不要迁移到MongoDB。但是像MongoDB这样的面向文档的数据存储基本上是一种非关系的组织数据的方式。它不同于关系。我不是说一个比另一个好,这只是一种不同的技术,适合不同类型的查询。

不要仅仅因为一项技术是新的,或者是为了时尚而选择它。

编辑:如果WHERE子句使用与虚拟列定义完全相同的表达式,那么MySQL中的虚拟列实现应该使用索引。也就是说,下面

应该

对虚拟列使用索引,因为已定义虚拟列

AS (JSON_EXTRACT(data,"$.series"))

其中JSON_在。。。

不过,通过测试这个特性,我发现如果表达式是JSON提取函数,它就不会工作。它适用于其他类型的表达式,只是不适用于JSON函数。

你可能感兴趣的:(mysql,存储大量json)