php - SQL Query Looking for optimization for complex query with indexes

标签 php mysql sql

$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 的新行。

mediaiduseriduid都是索引

服务器? 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

还需要下面的索引,把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);

关于php - SQL Query Looking for optimization for complex query with indexes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29870886/

相关文章:

java - 从 api 返回多个 order_id 的值

MySQL Varchar 数据在第 1 行为列 name_last 截断

MySQL:按组和字段排序

当存在更多记录时,SQL 语句仅提取 1 条记录

java - Hibernate 更快的 EntityManagerFactory 创建

php - 无法使用 hhvm 找到驱动程序 MySQL

php - 带 id 的多维关联数组

php - 高效存储数据

mysql - 如何在 sails.js 中运行多个适配器

php - 2 个表之间的右外连接