慢速MySQL(InnoDB)查询尽管加入了索引键,为什么?

时间:2011-08-17 09:33:48

标签: mysql sql mariadb

你知道为什么这个请求可能很慢(在一个快速的MySQL服务器上1.7秒):

SELECT DISTINCT TABLE_A.keyA 
FROM TABLE_A,TABLE_B 
WHERE TABLE_A.keyB= TABLE_B.keyB 
AND TABLE_A.fieldC in (0,2,5,7,8) LIMIT 20;

EXPLAIN

提供此执行计划
id    select_type table       type    possible_keys         key                   key_len   ref     rows     Extra 
1     SIMPLE      TABLE_B     index   PRIMARY               PRIMARY               8     NULL      10     Using index; Using temporary
1     SIMPLE      TABLE_A     ref     IDX_TABLE_A_KEY_B     IDX_TABLE_A_KEY_B     8     TABLE_B.keyB     25455     Using where

其他元素:

  • 表TABLE_A有300 000行
  • TABLE_A.keyA是TABLE_A
  • 的主键
  • TABLE_A.keyB是朝向TABLE_B的主键keyB的外键; 表TABLE_B有10行;
  • 99%的TABLE_A有fieldC = 1且表的1%在(0,2,5,7,8)中有fieldC(这就是为什么这个字段没有索引;编译这个子句没有问题因为一个SELECT使用相同的子句但没有与TABLE_B的连接很快);
  • 在我看来,JOIN是有罪的,因为桌面上的一个简单的SELECT很快;
  • 与另一个表的连接TABLE_C也很慢;
  • MySQL版本:5.1.23a-maria-alpha

你有什么想法吗?

5 个答案:

答案 0 :(得分:5)

  

99%的TABLE_A有fieldC = 1而且1%的表在(0,2,5,7,8)中有fieldC(这就是为什么这个字段没有被索引

这是索引该列的一个很好的理由。 您的查询只需要不到1%的表,因此索引非常有选择性。

答案 1 :(得分:2)

可能是IN条款,它们往往很慢,你有TABLE_A.fieldC的索引吗?

答案 2 :(得分:0)

SELECT DISTINCT TABLE_A.keyA 
FROM TABLE_A 
INNER JOIN TABLE_B ON TABLE_A.keyB = TABLE_B.keyB 
WHERE 
TABLE_A.fieldC IN (0, 2, 5, 7, 8) LIMIT 20;

尝试一下。

答案 3 :(得分:0)

SELECT DISTINCT TABLE_A.keyA 
FROM TABLE_A
WHERE TABLE_A.keyB IN (SELECT TABLE_B.keyB FROM TABLE_B )
AND TABLE_A.fieldC in (0,2,5,7,8) LIMIT 20;

答案 4 :(得分:0)

在列fieldC上添加索引。 然后运行查询

Select DISTINCT keyA from 
 (select keyA, keyB from TABLE_A where fieldC in (0,2,5,7,8)) 
as temp STRAIGHT_JOIN TABLE_B on temp.keyB=TABLE_B.keyB limit 20

尝试使用直接连接和内连接。