如何在 MySQL 中的 json 列上创建索引?
Posted
技术标签:
【中文标题】如何在 MySQL 中的 json 列上创建索引?【英文标题】:How to create index on json column in MySQL? 【发布时间】:2016-11-18 05:58:10 【问题描述】:如何在 mysql 服务器中为 Json 数据类型的子文档创建索引?
我知道我们必须从基表创建一个生成的列,然后需要对该列进行虚拟索引或存储。
但我想要为子文档创建生成列的语法。
【问题讨论】:
【参考方案1】:JSON 列与其他二进制类型的列一样,不直接索引;相反,您可以在生成的列上创建一个索引,从 JSON 列中提取一个标量值。有关详细示例,请参阅第 “Secondary Indexes and Generated Virtual Columns” 部分。
【讨论】:
另见:mysqlserverteam.com/indexing-json-documents-via-virtual-columns【参考方案2】:对于存储在JSON
中的索引值,请使用存储的generated column。
例如,用于索引title
和category
的
"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 as smart JSON storage :-)
【讨论】:
【参考方案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
【讨论】:
这看起来是一个非常有效的答案,我不明白为什么它在没有评论的情况下被否决。发行说明也没有太大帮助。它说这相当于调用CAST( JSON_UNQUOTE( JSON_EXTRACT(json_doc, path) ) AS type)
,但我认为我不能调用INDEX i1 ( CAST( JSON_UNQUOTE( JSON_EXTRACT(json_doc, path) ) AS type) )
。同上。所有这些问题都是因为我懒得启动测试环境。
好的。我对其进行了测试,发现它不起作用,这不是@NeverEndingQueue 的错。 Mysal文档有错误JSON_VALUE
不接受VARCHAR
应该改成CHAR
。两者的区别:dev.mysql.com/doc/refman/8.0/en/char.html以上是关于如何在 MySQL 中的 json 列上创建索引?的主要内容,如果未能解决你的问题,请参考以下文章
Oracle创建索引SQL简单的例子,在表中的指定字段和如何使用索引呢?
如何使用 xpath 表达式在 PostgreSQL 中的 XML 列上创建索引?