你知道为什么这个请求可能很慢(在一个快速的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
其他元素:
你有什么想法吗?
答案 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
尝试使用直接连接和内连接。