首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化MySql语句

问优化MySql语句
EN

Stack Overflow用户
提问于 2015-06-09 20:11:21
回答 2查看 35关注 0票数 0

这是一个面试问题,我一直都是提前回答的,我说我不知道如何优化查询--我在.Net堆栈中工作,已经享受实体框架很长一段时间了。所以我在这个领域的技能受到了一点影响。这也是MySql。

所以,这让我发疯了--想弄清楚我会如何优化这个声明。特别不允许DB与一起玩。

这份声明看起来很像这样:

代码语言:javascript
复制
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()子句中删除它们。

所以-你会怎么做?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-09 20:18:02

你对子查询的假设是正确的。乍一看,这就是问题所在。

因为它是一个简单的查询,所以您可以在查询中直接使用它。

我认为这是可行的(没有测试):

代码语言:javascript
复制
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)
票数 1
EN

Stack Overflow用户

发布于 2015-06-09 20:18:36

删除子查询,可以使用索引从子查询中获取结果,然后不再使用索引。

代码语言:javascript
复制
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

是非子查询版本。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30741904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档