我们的MySQL(的Percona Server)的数据库中有一个大桌子cotains 1000万行,有很多慢速查询longger超过40秒这样的:为什么MySQL不使用索引?
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,而不是关于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 |
+----+-------------+------------------+-------+--------------------+---------+---------+------+------+-------------+
当我force index (Seller)
,它是非常快,0.7秒。
而我发现如果不使用限制语句,这个查询将使用Seller
索引,会非常快。 为什么MySQL不使用带限制语句的Seller
上的索引?
您应该在查询上运行EXPLAIN并发布结果。 – 2013-03-18 03:09:37
**您需要向我们展示表和索引定义。**诊断慢查询需要全表和索引定义,而不仅仅是描述或释义。也许你的表格定义不好。也许索引没有正确创建。也许你没有一个你认为你做过的那个专栏的索引。没有看到表和索引定义,我们不能说。如果你知道如何做一个'EXPLAIN'或者得到一个执行计划,那就把结果也放在问题中。 – 2013-03-18 03:13:23
谢谢,我有我的问题发布EXPLAIN结果。 – KeepZero 2013-03-18 03:20:06