Mysql 任何可能的新专栏的规则基础看起来都不是个好主意
Python和PHP使JSON验证非常有魅力,所以我们是否需要在MySql端进行JSON验证是值得怀疑的。为什么不同时验证XML、Microsoft Office文档或检查拼写?;) 在表达式或函数中使用这样的列会破坏使用索引来帮助优化查询的任何机会。上面显示的查询被强制执行表扫描Mysql 任何可能的新专栏的规则基础看起来都不是个好主意,mysql,json,database,database-normalization,Mysql,Json,Database,Database Normalization,Python和PHP使JSON验证非常有魅力,所以我们是否需要在MySql端进行JSON验证是值得怀疑的。为什么不同时验证XML、Microsoft Office文档或检查拼写?;) 在表达式或函数中使用这样的列会破坏使用索引来帮助优化查询的任何机会。上面显示的查询被强制执行表扫描 SELECT * FROM t1 WHERE series IN ... 关于“有效访问”的说法具有误导性。这意味着,在查询使用JSON文档检查一行之后,它可以提取字段,而无需解析JSON语法的文本。但仍然需要进行
SELECT * FROM t1
WHERE 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最吸引人的地方是,它允许您添加新属性,而无需更改表。但事实证明,如果要借助索引搜索JSON字段,无论如何都必须定义一个额外的(虚拟)列
但是,您不必为JSON文档中的每个字段定义虚拟列和索引,只需为您想要搜索或排序的字段定义虚拟列和索引。JSON中可能还有其他属性,您只需在选择列表中提取,如下所示:
SELECT JSON_EXTRACT(data, '$.series') AS series FROM t1
WHERE <other conditions>
但我通过测试发现,如果表达式是JSON提取函数,由于某种原因,该功能不起作用。它适用于其他类型的表达式,只是不适用于JSON函数。Strong不同意其他答案中的一些说法(公平地说,这是几年前的事) 我们怀着健康的怀疑态度,非常谨慎地开始采用JSON字段。随着时间的推移,我们已经添加了更多 这通常描述了我们所处的情况:
- 就像99%的应用程序一样,我们并没有大规模地做事情。我们使用许多不同的应用程序和数据库,其中大多数都能够在普通硬件上运行
- 如果性能确实成为一个问题,我们有适当的流程和诀窍来进行更改
- 我们大致了解哪些表将是大的,并仔细考虑如何为它们优化查询
- 我们还知道,在哪些情况下,这不是真正需要的
- 我们非常擅长应用层的数据验证和静态类型
最后一点:现在可以直接在JSON字段上建立索引。哦,请不要说我认为你在说的话。“你的是一个坏主意的另一个变体。”你给出了一个大答案。但这不是我的问题。我只想知道,如果我们为json数据编写查询,那么我们可能会跳过sql规则。因为我们不需要太多的表,所以现在可以在列中存储更复杂的数据了。小心JSON数据类型支持索引,它有智能大小:64K&4G。那么,如果我想存储2000个数据并添加5个嵌套标签,而不是5个具有关系的表,那么问题出在哪里呢?“我真的很想了解更多有关此功能的信息。”和“MySQL JSON数据类型的优缺点。”都不是问题,如果重新表述为问题太广泛。“所以我从来没有想到MySQL中有复杂的模式结构和外键。我只使用几个表来存储复杂的关系。”这是自相矛盾的,因为JSON不是关系&FKs。对“IsThisGood”的解释只是对关系模型的介绍,所以这一点也太宽泛了。通过一些例子,列出你自己的优点和缺点以及参考资料,并询问你哪里出了错;Mysql内存表不支持JSON数据类型,如数据类型TEXT和BLOB。这意味着,如果需要临时表,它将创建一个基于磁盘的表,而不是内存。使用临时表的一些情况如下所述:@raizmedia您能详细说明为什么基于磁盘的表与内存(我想是基于磁盘的表)相比会出现问题吗?@lapin可能是由于速度限制。@如果您使用PCI 4x 40 Gb/s M.2插槽并插入40 Gb/s支持的驱动器,您可以避免这种情况。这和memmory一样快。您可以对其应用特殊格式
{ "name": "value", "newName": "value" }
UPDATE `JsonTable` SET `JsonColumn` = JSON_SET(`JsonColumn`, "newName", JSON_EXTRACT(`JsonColumn`, "name"))
SELECT * FROM t1
WHERE JSON_EXTRACT(data,"$.series") IN ...
ALTER TABLE t1
ADD COLUMN series AS (JSON_EXTRACT(data, '$.series')),
ADD INDEX (series);
SELECT * FROM t1
WHERE series IN ...
SELECT JSON_EXTRACT(data, '$.series') AS series FROM t1
WHERE <other conditions>
SELECT * FROM t1
WHERE JSON_EXTRACT(data,"$.series") IN ...