[英]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.