【发布时间】:2013-03-18 02:54:35
【问题描述】:
我们的 MySQL(Percona Server) 数据库有一个包含 1000 万行的大表,有很多长于 40 秒的慢查询:
SELECT col1, Seller, col3, col4, Id, col5
FROM table1
WHERE Seller = 346761
AND col1 IN (2, 3, 4)
AND col3 = 1
AND col4 NOT IN (5,6,7)
ORDER BY Id DESC
LIMIT 0, 20;
我在Seller、col1、col3、col4 上创建了索引。这些索引是单独的,而不是多列索引(AKA 覆盖索引)。 Id 是主键。
EXPLAIN 显示 MySQL 使用主键作为索引查询此 sql,而不是关于卖方的索引。
+----+-------------+------------------+-------+--------------------+---------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------------+-------+--------------------+---------+---------+------+------+-------------+
| 1 | SIMPLE | trans_audit_list | index | Seller,AuditStatus | PRIMARY | 8 | NULL | 1483 | Using where |
+----+-------------+------------------+-------+--------------------+---------+---------+------+------+-------------+
当我force index (Seller)时,速度非常快,0.7秒。
我发现如果不使用limit语句,这个查询会使用Seller索引,会非常快。
为什么 MySQL 不使用带有限制语句的 Seller 上的索引?
【问题讨论】:
-
您应该对查询运行 EXPLAIN 并发布结果。
-
您需要向我们展示表和索引定义。 诊断慢查询需要完整的表和索引定义,而不仅仅是描述或解释。也许您的表格定义不佳。也许索引没有正确创建。也许您认为您在该列上没有索引。没有看到表和索引定义,我们无法判断。如果您知道如何处理
EXPLAIN或获取执行计划,请将结果也放入问题中。 -
谢谢,我已经在我的问题中发布了 EXPLAIN 结果。