你知道为什么这个请求会很慢吗(在其他速度很快的 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% 的表有 fieldC 在 (0,2,5,7,8) (这就是为什么这个字段没有索引;编辑这个子句没有问题,因为 SELECT 具有相同的子句但不与 TABLE_B 连接很快);
- 在我看来,这是有罪的 JOIN,因为表上的简单 SELECT 很快;
- 与另一个表 TABLE_C 的连接也很慢;
- MySQL 版本:5.1.23a-maria-alpha
你有什么主意吗?