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

发布于 2024-12-11 18:05:35 字数 392 浏览 0 评论 0原文

此查询需要一秒钟

select * from tbl1 limit 0,1

此查询需要一秒钟

SELECT Distinct(col2) FROM tbl2 WHERE col3 = 2

此查询占用 100% cpu,需要 190 秒的持续时间(0 秒获取)才能返回结果

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

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

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

This query takes a split second

select * from tbl1 limit 0,1

This query takes a second

SELECT Distinct(col2) FROM tbl2 WHERE col3 = 2

This query eats 100% cpu and takes 190 seconds duration (0s fetch) to return the result

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

I am trying to run this query on the full data set (not just limiting it to one record)

What could be causing the performance problem, my table structures?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

如果没有你 2024-12-18 18:05:36

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

Add an index on tbl2, on col3 or (even better) on (col3,col2).

Then use this (no need for the DISTINCThere):

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

or even better, to avoid the IN (SELECT ...), this version:

SELECT * 
FROM tbl1 t
WHERE EXISTS 
      ( SELECT * 
        FROM tbl2 t2
        WHERE t2.col3 = 2 
          AND t2.col2 = t.ID
      ) 
LIMIT  0,1
与他有关 2024-12-18 18:05:35

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'

Subqueries in MySQL are notoriously slow. You can speed this up with a join:

SELECT A.*
FROM
    tbl1 A
    INNER JOIN (
        SELECT DISTINCT col2
        FROM
            tbl2
        WHERE
            col3 = 2
    ) X ON X.col2 = A.ID
LIMIT 0, 1

To update tbl1:

UPDATE
    tbl1 A
    INNER JOIN (
        SELECT DISTINCT col2
        FROM
            tbl2
        WHERE
            col3 = 2
    ) X ON X.col2 = A.ID
SET
    A.SomeCol = 'value'
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文