为什么 MySQL 不用我期望的索引?
我们的 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
, and
col1
,
col3
,
col4
这几个列已经建了独立索引。 Id 是主键。
EXPLAIN 显示 MySQL 查询这个语句的时候使用了 Primary key 索引, 而不是 Seller。
+----+-------------+------------------+-------+--------------------+---------+---------+------+------+-------------+ | 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 | +----+-------------+------------------+-------+--------------------+---------+---------+------+------+-------------+
我感觉这个查询如果用 Seller 上的索引会很快,果然,我强制
force index (Seller)
, 就只用 0.7 秒。
为什么 MySQL 不用 Seller 上的索引,感觉使用这个索引是很显然的。
是不是因为指定了 order by Id, Id 是主键,所以 MySQL 就用主键索引了?
另外:我发现如果不加上 Limit 语句,就会使用 Seller 索引,查询会非常快。
喵帕斯豆腐房
11 years, 5 months ago