我们的 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 |
+----+-------------+------------------+-------+--------------------+---------+---------+------+------+-------------+
当 I 时force index (Seller)
,它非常快,0.7 秒。
而且我发现如果不使用limit语句,这个查询会使用Seller
索引,会非常快。为什么 MySQL 不使用 index on Seller
with limit 语句?