繁体   English   中英

查询“IS NULL”时,为什么索引列会慢慢返回结果?

[英]Why would an indexed column return results slowly when querying for `IS NULL`?

我有一个2500万行的表,索引适当。

但添加子句AND status IS NULL会将超快查询转换为疯狂的慢查询。

请帮我加快速度。

查询:

SELECT 
    student_id,
    grade,
    status
FROM 
    grades
WHERE 
        class_id = 1
    AND status IS NULL       -- This line delays results from <200ms to 40-70s!
    AND grade BETWEEN 0 AND 0.7
LIMIT 25;

表:

CREATE TABLE IF NOT EXISTS `grades` (
  `student_id` BIGINT(20) NOT NULL,
  `class_id` INT(11) NOT NULL,
  `grade` FLOAT(10,6) DEFAULT NULL,
  `status` INT(11) DEFAULT NULL,
  UNIQUE KEY `unique_key` (`student_id`,`class_id`),
  KEY `class_id` (`class_id`),
  KEY `status` (`status`),
  KEY `grade` (`grade`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

本地开发立即显示结果(<200ms)。 生产服务器大幅减速(40-70秒!)。

你能指出我正确的调试方向吗?

说明:

+----+-------------+--------+-------------+-----------------------+-----------------+---------+------+-------+--------------------------------------------------------+
| id | select_type | table  | type        | possible_keys         | key             | key_len | ref  | rows  | Extra                                                  |
+----+-------------+--------+-------------+-----------------------+-----------------+---------+------+-------+--------------------------------------------------------+
|  1 | SIMPLE      | grades | index_merge | class_id,status,grade | status,class_id | 5,4     | NULL | 26811 | Using intersect(status,class_id); Using where          |
+----+-------------+--------+-------------+-----------------------+-----------------+---------+------+-------+--------------------------------------------------------+

SELECT语句每个表只能使用一个索引。

据推测,之前的查询仅使用条件class_id=1的唯一索引class_id进行扫描。 在检查其他条件之前,这可能会很好地过滤您的结果集。

优化器“错误地”在class_id上选择索引合并,为第二个查询选择status ,并检查可能不是最佳的26811行。 您可以通过在FROM子句的末尾添加USING INDEX (class_id)来提示class_id索引。 您可以通过(class_id,status,grade)上的复合索引获得一些乐趣,它可以更快地运行查询,因为它可以匹配前两个,然后范围扫描grade 我不确定这是如何使用null

我猜测ORDER BY推动优化器再次选择class_id索引并将查询返回到原始速度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM