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

Ama*_*wal 13 database indexing json mysql-5.7

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

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

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

ΔO *_*ro' 17

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

在示例中,用于索引titlecategory

{"title": "Some Title", "category": "Some Category", "url": "...", ...}
Run Code Online (Sandbox Code Playgroud)

使用类似的东西:

{"title": "Some Title", "category": "Some Category", "url": "...", ...}
Run Code Online (Sandbox Code Playgroud)

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


小智 8

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


Nev*_*eue 6

在 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)) )
);
Run Code Online (Sandbox Code Playgroud)

并使用以下查询:

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;
Run Code Online (Sandbox Code Playgroud)

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

  • 好的。我测试了它,发现它不起作用,这不是@NeverEndingQueue 的错。Mysal 文档有一个错误“JSON_VALUE”不接受“VARCHAR”应更改为“CHAR”。两者之间的差异:https://dev.mysql.com/doc/refman/8.0/en/char.html (2认同)