2017-07-20 185 views
0

所以,我刚刚开始了一个新的mySQL数据库,它有两个主表,bigTable [600,000行]和lilTable [8000行]。有一个字段blId链接表,这些表已被索引在bigTable中。极慢嵌套mySQL查询

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

事不宜迟,这里是我的非常慢查询:

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

这需要〜52秒跑在我的电脑,上,仍然需要50秒的时候,内部查询返回0的结果!相反,如果我单独运行内部查询并手动创建一个可接受的blId的列表,该列表代替了子查询,它将在不到十分之一秒的时间内运行。蓝色火焰正在发生什么?

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

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

你必须在sql中使用'LIKE'吗?如果你改成'color ='blue'',会更快吗?请包括表结构。 –

+0

你有没有在表格中定义的索引?桌子有多大?为什么使用Like? – ChuckCottrill

回答

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)的索引。

+1

速度基本一样。 –

+0

@CarlShiles。 。 。你有指定的索引吗? –

+0

我这样做,但是我没有在示例中包含它,因为当将表达式嵌套到其他选择中时,索引显然不是问题,因此速度提高了100倍。我正在寻找可以解释这种行为的有经验的人。 –