$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
每天有大约 30k 的新行。
mediaid
、userid
、uid
都是索引
服务器? 8 核 x 3,2,16GB 内存。可扩展的云。平均负载很好。不超过 20% cpu
编辑:解释选择返回以下数据:
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);
关于php - SQL Query Looking for optimization for complex query with indexes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29870886/