如何在MySQL中的json列上创建索引?

How to create index on json column in MySQL?

提问人:Aman Aggarwal 提问时间:7/15/2016 最后编辑:BenMorelAman Aggarwal 更新时间:3/29/2021 访问量:36355

问:

如何在MySQL服务器中以Json数据类型为子文档创建索引?

我知道我们必须从基表创建一个生成的列,然后需要对该列进行索引 虚拟 or 存储。

但是我想要为子文档创建生成列的语法。

JSON 数据库 索引 mysql-5.7

评论


答:

9赞 Bipil Raut 7/15/2016 #1

JSON 列与其他二进制类型的列一样,不直接编制索引;相反,您可以在生成的列上创建索引,以从 JSON 列中提取标量值。有关详细示例,请参见“二级索引和生成的虚拟列”一节。

评论

1赞 kjdion84 7/18/2017
另请参阅: mysqlserverteam.com/indexing-json-documents-via-virtual-columns
21赞 ΔO 'delta zero' 7/11/2020 #2

对于存储在 中的索引值,请使用存储的生成列JSON

例如,对于索引和titlecategory

{"title": "Some Title", "category": "Some Category", "url": "...", ...}

使用类似的东西:

CREATE TABLE listings (
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  title VARCHAR(255) AS
    (data->>'$.title') STORED,
  category VARCHAR(255) AS
    (data->>'$.category') STORED,
  data JSON NOT NULL,
  KEY (title),           -- index title
  KEY (category),        -- index category
  KEY (title, category)  -- composite index of title & category
);

阅读更多关于MySQL作为智能JSON存储的信息:-)

16赞 Tom Raganowicz 3/8/2021 #3

在MySQL 8.0.21版本中,可以使用以下语法:

CREATE TABLE inventory(
items JSON,
INDEX i1 ( (JSON_VALUE(items, '$.name' RETURNING CHAR(50))) ),
INDEX i2 ( (JSON_VALUE(items, '$.price' RETURNING DECIMAL(5,2))) ),
INDEX i3 ( (JSON_VALUE(items, '$.quantity' RETURNING UNSIGNED)) )
);

并使用以下方法进行查询:

SELECT items->"$.price" FROM inventory
WHERE JSON_VALUE(items, '$.name' RETURNING VARCHAR(50)) = "hat";

SELECT * FROM inventory
WHERE JSON_VALUE(items, '$.price' RETURNING DECIMAL(5,2)) <= 100.01;

SELECT items->"$.name" AS item, items->"$.price" AS amount
FROM inventory
WHERE JSON_VALUE(items, '$.quantity' RETURNING UNSIGNED) > 500;

来源: https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-21.html

评论

1赞 toraman 3/29/2021
这看起来是一个非常有效的答案,我不明白为什么它在没有评论的情况下被否决。发行说明也没有多大帮助。它说这相当于打电话,但我认为我不能做.伊迪克。所有这些问题都是因为我懒得启动测试环境。CAST( JSON_UNQUOTE( JSON_EXTRACT(json_doc, path) ) AS type)INDEX i1 ( CAST( JSON_UNQUOTE( JSON_EXTRACT(json_doc, path) ) AS type) )
2赞 toraman 3/29/2021
好吧。我测试了一下,发现它不起作用,这不是@NeverEndingQueue的错。Mysal 文档有错误不接受应更改为 .对于两者之间的差异:dev.mysql.com/doc/refman/8.0/en/char.htmlJSON_VALUEVARCHARCHAR