【问题标题】:Indexing an array in a MySQL JSON column with variable length elements索引具有可变长度元素的 MySQL JSON 列中的数组
【发布时间】:2020-07-26 09:27:03
【问题描述】:

我正在尝试索引内容是可变长度字符串的 json 数组,但我无法确定它是否可能,更不用说可扩展了。

关于使用新的多值索引索引 JSON 数据的一个非常相似的问题在这里:Indexing JSON column in MySQL 8

执行该问题的语法,但使用 CHAR 不适合我,并且无论如何都会以错误结束。更改名称并调整我的数据的 CHAR 长度后:

ALTER TABLE catalog ADD INDEX idx_30144( (CAST( j_data->>'$."30144"' AS char(250) ARRAY)) );

我收到此错误

1034 - Incorrect key file for table 'catalog'; try to repair it

试试这个:

ALTER TABLE catalog ADD INDEX idx_30144( (CAST( j_data->>'$."30144"' AS varchar(250) ARRAY)) );

给出这个错误:

1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'varchar(250) ARRAY)) )' at line 1

这是一个 InnoDB 表,因此 1034 错误显然不准确。它在大约 2 秒内完成,因此虽然它可能空间不足,但它发生得太快而无法看到,并且驱动器上有 350 GB 可用空间。

理想情况下,我有超过 200 个这样的 JSON 节点想要索引。如果这是一个巨大的存储空间,我可以对其中的一部分感到满意​​,但我首先需要知道它是否可能。

【问题讨论】:

    标签: mysql arrays json indexing


    【解决方案1】:

    您只能通过生成您索引的列来索引这些值

    喜欢

    CREATE TABLE jempn (
      id BIGINT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY,
      j_data JSON DEFAULT NULL,
      g varchar(250) GENERATED ALWAYS AS (j_data->'$."30144"' ) STORED,
      INDEX idx_30144 (g)
    ) ENGINE=INNODB;
    

    【讨论】:

    • 生成的列只是字符串数组,但尝试在其上创建索引会引发错误“1071 - 指定键太长:最大键长度为 3072 字节”,可能是因为某些这些数组很长。而且,对于 json 查询来说,索引是否还需要是多值函数类型?
    • 考虑到索引的工作方式 250 个字符是巨大的,我只用 50 完成了 uuid。索引尝试对值进行排序,以便它可以以对数步数快速找到所需的数据。考虑一下,您可以生成一个 FULLTEXT 并使用 match 在其中搜索,而不是使用 250 个字符的索引。
    猜你喜欢
    • 2016-05-13
    • 2013-11-14
    • 2020-11-28
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多