1

你知道为什么这个请求会很慢吗(在其他速度很快的 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

你有什么主意吗?

4

5 回答 5

5

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

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

于 2011-08-17T09:48:42.987 回答
2

可能是IN子句,它们往往很慢,你有索引TABLE_A.fieldC吗?

于 2011-08-17T09:47:11.637 回答
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;

试试那个。

于 2011-08-17T09:47:11.417 回答
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;
于 2011-08-17T09:49:05.447 回答
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

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

于 2011-08-17T10:10:49.097 回答