MySQL覆盖索引疑似Bug:特定条件下查询无返回结果问题咨询
MySQL 空JSON数组导致函数表达式索引失效问题
环境复现
表结构与测试数据
CREATE TABLE project_sheets ( id INT AUTO_INCREMENT PRIMARY KEY, project_id INT NULL, path JSON NULL, INDEX project_sheets_path_index(project_id, (CAST(path->'$' AS CHAR(255) ARRAY))) ) COLLATE = utf8mb4_unicode_ci; INSERT INTO test.project_sheets (project_id, path) VALUES (40, '[]');
异常查询(无结果返回)
使用默认索引执行查询时,无法匹配到数据:
SELECT * FROM test.project_sheets WHERE project_id = 40;
正常查询(返回1条结果)
忽略该函数表达式索引后,查询正常返回预期记录:
SELECT * FROM test.project_sheets IGNORE INDEX (project_sheets_path_index) WHERE project_id = 40;
特殊情况
若向path字段的JSON数组中添加元素(例如'[1,2]'),无论是否使用该索引,查询均能正常返回结果。
问题本质
这是MySQL优化器在处理包含空JSON数组的函数表达式复合索引时的逻辑缺陷:优化器在构建索引条目时,对空JSON数组的CAST处理存在异常,导致查询时无法通过索引匹配到对应记录;而跳过该索引后,查询走全表扫描或主键索引,即可正确识别空JSON数组的记录。
内容的提问来源于stack exchange,提问作者AlexProh
相关产品推荐
相关产品推荐

