非常慢的嵌套mySQL查询

时间:2017-07-20 02:32:32

标签: mysql sql

所以,我刚刚开始一个新的mySQL数据库,有两个主表,bigTable [600,000行]和lilTable [8000行]。有一个字段blId链接表,这些表已在bigTable中编入索引。

我想从bigTable中选择与lilTable中符合特定条件的任何条目共享blId的所有条目,但我不需要该表中的任何其他信息,因此连接似乎过多。

不用多说,这是我非常慢的查询:

SELECT * FROM testdb.bigTable where blId in 
(SELECT blId FROM certtest.lilTable WHERE color LIKE 'blue'); 

这需要大约52秒才能在我的计算机上运行,当内部查询返回0结果时仍需要50秒!相反,如果我单独运行内部查询并手动创建列表可接受的blId代替子查询,它运行不到十分之一秒。蓝色的火焰在这里发生了什么?

编辑:所以我找到了一种加速它的方法,将它包装在另一个冗余的select语句中? (将查询时间减少到0.25秒)任何人都可以解释这种行为,非常感谢。

SELECT * FROM testdb.bigTable where blId in 
(SELECT * FROM 
  (SELECT blId FROM certtest.lilTable WHERE color LIKE 'blue') AS why
); 

1 个答案:

答案 0 :(得分:1)

请尝试使用exists

SELECT bt.*
FROM testdb.bigTable bt
WHERE EXISTS (SELECT 1
              FROM certtest.lilTable lt
              WHERE lt.color LIKE 'blue' AND bt.blID = lt.blId
             ); 

出于此查询的目的,您需要lilTable(blId, color)上的索引。