繁体   English   中英

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

[英]Slow MySQL (InnoDB) query despite join on indexed key, why?

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

你有什么主意吗?

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

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

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

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;

试试那个。

尝试

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;

在列 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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM