所以,我刚刚开始一个新的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
);
答案 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)
上的索引。