MySQL - WHERE IN导致100%的CPU并且没有结果

时间:2011-10-24 14:36:29

标签: mysql performance

此查询需要一瞬间

select * from tbl1 limit 0,1

此查询需要第二次

SELECT Distinct(col2) FROM tbl2 WHERE col3 = 2

此查询占用100%cpu并持续190秒(0s fetch)返回结果

select * from tbl1 WHERE ID IN (SELECT Distinct(col2) FROM tbl2 WHERE col3 = 2) limit 0,1

我正在尝试在完整数据集上运行此查询(不只是将其限制为一条记录)

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

2 个答案:

答案 0 :(得分:3)

MySQL中的子查询非常慢。您可以通过加入加快速度:

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

UPDATE
    tbl1 A
    INNER JOIN (
        SELECT DISTINCT col2
        FROM
            tbl2
        WHERE
            col3 = 2
    ) X ON X.col2 = A.ID
SET
    A.SomeCol = 'value'

答案 1 :(得分:0)

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

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

SELECT * 
FROM tbl1 
WHERE ID IN (SELECT col2 FROM tbl2 WHERE col3 = 2) 
LIMIT  0,1

甚至更好,以避免IN (SELECT ...),此版本:

SELECT * 
FROM tbl1 t
WHERE EXISTS 
      ( SELECT * 
        FROM tbl2 t2
        WHERE t2.col3 = 2 
          AND t2.col2 = t.ID
      ) 
LIMIT  0,1