簡體   English   中英

如何加快 sql 查詢?

[英]How to speed up the sql query?

我有一個 SQL 查詢如下:

SELECT p.Id1,p.Id2,p.Id3 
FROM dataset1 p
WHERE p.Id2 IN (
    SELECT r.Id4 
    FROM dataset1 r 
    WHERE r.Id5=125 AND r.Id6>=100000000000000 AND r.Id6<1000000000000000
) 
ORDER BY p.Id1 DESC, p.Id2 DESC

然而,在這個范圍內似乎有大量 Id6 的數據,因此計算需要相當長的時間。 但我只有一小時來計算查詢。 因此,我想知道是否有人可以幫助我提高此查詢的性能。

謝謝。

由於過濾似乎是在r上完成的,所以先安排一下:

SELECT  p.Id1, p.Id2, p.Id3
    FROM  ( SELECT id4
       FROM dataset1 AS r
       WHERE  r.id5 = 125
         AND  r.Id6 >= 100000000000000
         AND  r.Id6 <  100000000000000 ) AS x
    JOIN dataset1 AS p  ON p.id2 = x.id4
    ORDER BY  p.Id1 DESC, p.Id2 DESC;

為此,這些索引應該是有益的:

INDEX(id5, id6, id4)   -- covering
INDEX(id2, id1, id3)   -- covering

您對id6進行了“范圍”測試,但范圍為空。 我認為那是一個錯誤。 請不要過分簡化查詢; 我們可能會給您不適用的建議。 我假設范圍確實是一個范圍。

當子查詢返回大量數據時, IN往往優化不佳。 您可以嘗試改用EXISTS

SELECT p.Id1, p.Id2, p.Id3 
FROM dataset1 p
WHERE EXISTS (
    SELECT 1
    FROM dataset1 r 
    WHERE 
        r.Id4 = p.Id2
        AND r.Id5 = 125 
        AND r.Id6 >= 100000000000000 
        AND r.Id6 <  100000000000000
) 
ORDER BY p.Id1 DESC, p.Id2 DESC

然后,考慮在(Id4, Id5, Id6)上建立一個多列索引來加速子查詢。 這個想法是把更嚴格的標准放在第一位 - 所以很明顯你想要Id6最后,但你可能想嘗試反轉前兩列,看看是否有任何組合比另一個表現更好。

旁注: Id6的下限和上限在您的查詢中具有相同的值。 我認為這是一個錯字(否則您的查詢將始終不返回任何行)。

為了提高性能,不要使用內部查詢。 您也可以使用內部連接來獲得所需的結果:

SELECT 
    p.Id1, p.Id2, p.Id3 
FROM 
    dataset1 p 
INNER JOIN 
    dataset1 r ON p.Id2 = r.Id4 
               AND r.Id5 = 125 
               AND r.Id6 >= 100000000000000 
               AND r.Id6 < 100000000000000
ORDER BY 
    p.Id1 DESC, p.Id2 DESC

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM