【问题标题】:How to create index on json array type in mysql5.7如何在 mysql 5.7 中创建 json 数组类型的索引
【发布时间】:2017-12-02 09:37:21
【问题描述】:

现在我使用像SELECT * FROM user WHERE JSON_CONTAINS(users, '[1]');这样的SQL脚本,但它会扫描全表,效率低下。所以我想在users 列上创建索引。

例如,我有一个名为users 的列,数据看起来像[1,2,3,4]。请告诉我如何在 JSON 数组类型上设置索引(生成虚拟列)。我已经阅读了 MySQL 网站上的文档,他们都谈到了使用 JSON_EXTRACT() 函数在 JSON 对象类型中进行索引。

【问题讨论】:

  • 生成的列在这里对您没有帮助。您需要规范化您的表才能有效地运行查找。

标签: mysql json


【解决方案1】:

你不能,至少不能按照你想要的方式。在The JSON Data Type,我们可以阅读:

JSON 列,与其他二进制类型的列一样,没有索引 直接地;相反,您可以在生成的列上创建一个索引 从JSON 列中提取一个标量值。详见Indexing a Generated Column to Provide a JSON Column Index 例子。

因此,限制随之而来的是解决方法 ;-)

【讨论】:

【解决方案2】:

现在可以使用 MySQL 8+

这是一个例子:

CREATE TABLE customers (
    id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    modified DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    custinfo JSON
    );

ALTER TABLE customers ADD INDEX comp(id, modified, 
    (CAST(custinfo->'$.zipcode' AS UNSIGNED ARRAY)) );

这样使用:

SELECT * FROM customers 
    ->     WHERE JSON_CONTAINS(custinfo->'$.zipcode', CAST('[94507,94582]' AS JSON));

更多信息: https://dev.mysql.com/doc/refman/8.0/en/create-index.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多