MySQL-WHERE-IN导致100%的cpu,但没有结果

MySQL-WHERE-IN导致100%的cpu,但没有结果,mysql,performance,Mysql,Performance,此查询需要一秒钟的时间 select * from tbl1 limit 0,1 此查询需要一秒钟的时间 SELECT Distinct(col2) FROM tbl2 WHERE col3 = 2 此查询占用100%的cpu,返回结果需要190秒的时间 select * from tbl1 WHERE ID IN (SELECT Distinct(col2) FROM tbl2 WHERE col3 = 2) limit 0,1 我试图在完整数据集上运行此查询,而不仅仅是将其限制为一条记

此查询需要一秒钟的时间

select * from tbl1 limit 0,1
此查询需要一秒钟的时间

SELECT Distinct(col2) FROM tbl2 WHERE col3 = 2
此查询占用100%的cpu,返回结果需要190秒的时间

select * from tbl1 WHERE ID IN (SELECT Distinct(col2) FROM tbl2 WHERE col3 = 2) limit 0,1
我试图在完整数据集上运行此查询,而不仅仅是将其限制为一条记录


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

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,请执行以下操作:

在tbl2、col3或更好的col3、col2上添加索引

然后使用此选项,无需区分:

或者更好的方法是,为了避免选择…,此版本:

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

tbl1中有多少条记录?你在tbl2.col3上有索引吗?我想它可能会被反复评估,有没有一种没有“where in”的更快的方法来实现这一点当我纠正性能问题时,我需要将select更改为更新。我一直在使用select来尝试并计算使用我的方法仅选择一行需要多长时间,但实际上我需要进行大规模更新,是否可以在更新中使用join方法?假设tbl1.ID是唯一的或PK,那么这是正确的。克里斯,假设你想更新tbl1上的一列,当然。我将更新我的示例。我将尝试这个,看看它是否有效;从tbl1更新为内部连接从tbl2选择distinctcol2,其中col3=2 x on x.col2=a.id SET a.processed=0 Hanks Sean,您帮了大忙,我很高兴有更好的方法来实现这一点:
SELECT * 
FROM tbl1 
WHERE ID IN (SELECT col2 FROM tbl2 WHERE col3 = 2) 
LIMIT  0,1
SELECT * 
FROM tbl1 t
WHERE EXISTS 
      ( SELECT * 
        FROM tbl2 t2
        WHERE t2.col3 = 2 
          AND t2.col2 = t.ID
      ) 
LIMIT  0,1