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