[英]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萬行。
mediaid
, userid
, uid
都是索引。
服務器? 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
還需要以下索引,將database1
和database2
更改為真實表名
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.