簡體   English   中英

SQL Select 使用索引進行查詢優化

[英]SQL Select query optimization with indexing

一個帖子表包含 100 萬行。 此表有一個名為poster_id的字段。

我有這個poster_id的關注者列表

我正在嘗試獲取過去 48 小時內此關注者的所有活動列表(在這種情況下為 35 個,但可能更少或更多)。

我使用這個查詢:

SELECT post_id
     , topic_id
     , poster_id
     , post_time 
  FROM posts 
 WHERE post_time > 1606833542 
   AND poster_id IN (80202, 74247, 79290, 72488, 
                    111751, 85040, 100256, 68025, 
                    101088, 101598, 101950, 103252, 
                    103071, 80063, 100372, 102530, 109961, 
                    109854, 105626, 108967, 110391, 104423, 
                    113243, 111673, 113979, 104670, 127318, 
                    68252, 109606, 121393, 122991, 124489, 
                    127723, 126525) 
 ORDER 
    by post_time 
 LIMIT 100

問題:

此查詢執行時間過長(0.4000 秒)。

poster_id 具有 post 表的索引。

我怎樣才能使這個查詢更快?

盡量避免使用 IN 子句並使用連接

    SELECT 
          p.post_id
        , p.topic_id
        , p.poster_id
        , p.post_time 
    FROM posts p
    INNER JOIN (
              SELECT 80202 poster_id
        UNION SELECT 74247
        UNION SELECT 79290 
        UNION SELECT  72488 
        UNION SELECT  111751 
        UNION SELECT  85040 
        UNION SELECT  100256 
        UNION SELECT  68025 
        UNION SELECT  101088 
        UNION SELECT  101598 
        UNION SELECT  101950 
        UNION SELECT  103252 
        UNION SELECT  103071 
        UNION SELECT  80063 
        UNION SELECT  100372 
        UNION SELECT  102530 
        UNION SELECT  109961 
        UNION SELECT  109854 
        UNION SELECT  105626 
        UNION SELECT  108967 
        UNION SELECT  110391 
        UNION SELECT  104423 
        UNION SELECT  113243 
        UNION SELECT  111673 
        UNION SELECT  113979 
        UNION SELECT  104670 
        UNION SELECT  127318 
        UNION SELECT  68252 
        UNION SELECT  109606 
        UNION SELECT  121393 
        UNION SELECT  122991 
        UNION SELECT  124489 
        UNION SELECT  127723 
        UNION SELECT  126525
    ) t ON t.poster_id = p.poster_id
        AND p.post_time > 1606833542 
    ORDER by p.post_time LIMIT 100

可能是 IN 子句中的值是一些子查詢,在這種情況下,ypou 可以使用相關的子查詢而不是 UNION .....

WHERE IN clase 與 serverl OR 條件(幾個內部子查詢)相同。而不是 INNER JOIN 只檢查單個操作中的值

為了獲得更好的性能,您可以嘗試使用冗余索引,而不是您在 poster_id 上的實際索引,在索引中添加您 select 的所有列,例如:

在帖子(poster_id、post_id、topic_id、post_time)上創建索引 my_index

這樣所有的查詢值都是使用索引獲得的,查詢不需要在表上訪問..

暫無
暫無

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

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