首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有子查询的坏查询优化器策略

带有子查询的坏查询优化器策略
EN

Stack Overflow用户
提问于 2015-08-12 08:12:32
回答 2查看 71关注 0票数 0

我有一个查询需要很长时间,因为对一个非常大的表进行了不可思议的全面扫描。

代码语言:javascript
复制
EXPLAIN
SELECT count(*)
FROM BigTable
WHERE (username = 'me' OR id IN (SELECT id FROM SmallTable WHERE username = 'me'));

BigTableusernameid列都有索引。所以我认为这个查询非常快,但实际上它需要很长时间,因为mysql查询了所有400万行BigTable。

解释申报表:

1,主,BigTable,索引,BigTable_N52,BigTable_N52,9,NULL,4364507,“使用何处;使用索引” 2,SUBQUERY,SmallTable,ref,“.”,SmallTable_username,9,const,11,NULL

令人惊讶的是,当我删除子查询并添加实际is时,性能和查询计划器策略就像预期的那样:

代码语言:javascript
复制
EXPLAIN
SELECT count(*)
FROM BigTable
WHERE (username = 'me' OR id IN (1,2,3,4));

解释:

1,BigTable,index_merge,“BigTable_N52","BigTable_N52,BigTable_N52”,"9,8",NULL,236,“使用union(BigTable_N52,BigTable_N52);使用where”

有什么我能解决的办法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-12 08:15:36

代码语言:javascript
复制
SELECT SUM(c_rec) FROM
(
SELECT count(*) AS c_rec
FROM BigTable
WHERE (username = 'me')
UNION ALL
SELECT count(*)
FROM BigTable
WHERE id
IN (SELECT id FROM SmallTable WHERE username = 'me')
) t

试试这个解决方案。

票数 1
EN

Stack Overflow用户

发布于 2015-08-16 01:39:16

构造IN ( SELECT ... )的优化效果很差。把它变成一个JOIN

除了@realnumber3012 3012的UNION之外,执行此UNION还将使其速度更快。

至于因加入而导致的通货膨胀,请试一试:

代码语言:javascript
复制
SELECT  COUNT(*)
    FROM
    (
      ( SELECT  id
            FROM  BigTable
            WHERE  username = 'me'
      ) UNION  DISTINCT 
      ( SELECT  id
            FROM  BigTable b
            JOIN  SmallTable s USING(id)
            WHERE  s.username = 'me')
      )
    ) t 

如果以两种方式查找ids,则在DISTINCTifies之前对它们进行COUNTing。

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

https://stackoverflow.com/questions/31959601

复制
相关文章

相似问题

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