这是一个面试问题,我一直都是提前回答的,我说我不知道如何优化查询--我在.Net堆栈中工作,已经享受实体框架很长一段时间了。所以我在这个领域的技能受到了一点影响。这也是MySql。
所以,这让我发疯了--想弄清楚我会如何优化这个声明。特别不允许DB与一起玩。
这份声明看起来很像这样:
SELECT a.eid, a.cid, b.e_date
FROM table_A a
JOIN table_B b ON a.eid = b.eid
WHERE a.cid IN
(SELECT cid FROM table_A_trans WHERE `someDateColumn` <= '2014-06-01 00:00:00')
AND a.eid NOT IN(123,124,200)我认为这可能与运行子查询有关,该子查询可能会返回数百个结果,然后在最后的NOT IN()子句中删除它们。
所以-你会怎么做?
发布于 2015-06-09 20:18:02
你对子查询的假设是正确的。乍一看,这就是问题所在。
因为它是一个简单的查询,所以您可以在查询中直接使用它。
我认为这是可行的(没有测试):
SELECT a.eid, a.cid, b.e_date
FROM table_A a
JOIN table_B b ON a.eid = b.eid
JOIN table_A_trans c ON a.cid = c.cid
WHERE c.someDateColumn <= '2014-06-01
AND a.eid NOT IN(123,124,200)发布于 2015-06-09 20:18:36
删除子查询,可以使用索引从子查询中获取结果,然后不再使用索引。
SELECT a.eid, a.cid, b.e_date
FROM table_A a
INNER JOIN table_B b ON a.eid = b.eid
INNER JOIN table_A_trans a_trans ON a.cid = a_trans.cid
WHERE
a_trans.someDateColumn <= '2014-06-01 00:00:00'
AND a.eid NOT IN(123,124,200)
GROUP BY a_trans.cid是非子查询版本。
https://stackoverflow.com/questions/30741904
复制相似问题