簡體   English   中英

SQL查詢尋找具有索引的復雜查詢的優化

[英]SQL Query Looking for optimisation for complex query with indexes

$query = "SELECT * 
          FROM $database1 
          WHERE userid!='$userid' 
            AND mediaid NOT IN (SELECT mediaid 
                                FROM $database2 
                                WHERE uid='$userid')
          ORDER BY active ASC LIMIT 80";

到現在為止,該查詢一直運行良好。

突然花了0.5到有時甚至3秒鍾來執行,有時甚至下降到0.1,這是可以接受的。

現在, database2大約有300萬行,而database1大約有500萬行,但是當database1只有100個項目時,它有時也很慢。 我很擔心,因為database2每天大約要增加3萬行。

mediaiduseriduid都是索引。

服務器? 8cores x 3,2,16GB內存 可擴展的雲。 平均負載很好。 cpus不超過20%

編輯:解釋選擇返回以下數據:

1   PRIMARY database1   index   userid  active  4   NULL    80  Using where
2   DEPENDENT SUBQUERY  database2   index_subquery  uid,mediaid mediaid 130 func    93  Using where

您可以將查詢更改為左聯接

select
d1.* from $database1 d1
left join $database2 d2 on d2.mediaid = d1.mediaid
and d2.uid='$userid'
where d1.userid!='$userid' 
and d2.mediaid is null
ORDER BY d1.active LIMIT 80

還需要以下索引,將database1database2更改為真實表名

alter table `database1` add index ua_idx(userid,active);
alter table `database1` add index mid_idx(mediaid);
alter table `database2` add index u_mid_idx(mediaid,uid);

最后,我重新編寫了查詢以下載當前用戶ID的兩個數據。 然后在php中進行計算。 現在非常快。 x10更快。 現在很好。

暫無
暫無

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

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