你知道为什么这个请求可能很慢(在一个快速的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(这就是为什么该字段没有被索引; EDIT该子句没有问题,因为具有相同的SELECT子句但没有与TABLE_B的连接很快);
在我看来,JOIN是有罪的,因为表上的一个简单的SELECT很快;
与另一个表连接TABLE_C也很慢;
MySQL版本:5.1.23a-maria-alpha
你有什么主意吗?
99%的TABLE_A有fieldC = 1,表的1%在(0,2,5,7,8)中有fieldC(这就是为什么这个字段没有索引的原因)
这是索引该列的一个很好的理由.您的查询只需要不到1%的表,因此索引非常有选择性.