首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL -其中IN导致100%cpu且无结果

MySQL -其中IN导致100%cpu且无结果
EN

Stack Overflow用户
提问于 2011-10-24 22:36:29
回答 2查看 159关注 0票数 2

此查询耗时极短

代码语言:javascript
复制
select * from tbl1 limit 0,1

这个查询需要一秒钟

代码语言:javascript
复制
SELECT Distinct(col2) FROM tbl2 WHERE col3 = 2

此查询占用100%的cpu,并花费190秒的时间(0次提取)来返回结果

代码语言:javascript
复制
select * from tbl1 WHERE ID IN (SELECT Distinct(col2) FROM tbl2 WHERE col3 = 2) limit 0,1

我尝试在整个数据集上运行这个查询(而不仅仅是限制到一条记录)。

是什么导致了性能问题,我的表结构?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-24 22:39:34

众所周知,MySQL中的子查询速度很慢。您可以使用join来加速此过程:

代码语言:javascript
复制
SELECT A.*
FROM
    tbl1 A
    INNER JOIN (
        SELECT DISTINCT col2
        FROM
            tbl2
        WHERE
            col3 = 2
    ) X ON X.col2 = A.ID
LIMIT 0, 1

更新tbl1的步骤

代码语言:javascript
复制
UPDATE
    tbl1 A
    INNER JOIN (
        SELECT DISTINCT col2
        FROM
            tbl2
        WHERE
            col3 = 2
    ) X ON X.col2 = A.ID
SET
    A.SomeCol = 'value'
票数 3
EN

Stack Overflow用户

发布于 2011-10-24 22:44:57

tbl2col3或(甚至更好) (col3,col2)上添加索引。

然后使用这个(这里不需要DISTINCT):

代码语言:javascript
复制
SELECT * 
FROM tbl1 
WHERE ID IN (SELECT col2 FROM tbl2 WHERE col3 = 2) 
LIMIT  0,1

或者更好的是,为了避免IN (SELECT ...),这个版本:

代码语言:javascript
复制
SELECT * 
FROM tbl1 t
WHERE EXISTS 
      ( SELECT * 
        FROM tbl2 t2
        WHERE t2.col3 = 2 
          AND t2.col2 = t.ID
      ) 
LIMIT  0,1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7877290

复制
相关文章

相似问题

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