如何在 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。

例如,用于索引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 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 列上创建索引?

Oracle创建索引SQL简单的例子,在表中的指定字段和如何使用索引呢?

如何在 NULL 列上创建唯一索引?

在 MySql 中的 Varchar 列上设置索引

如何创建一个虚拟列来索引 MySQL 中的 JSON 列?