SQL查询寻找具有索引

时间:2015-04-25 21:22:25

标签: 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每天新增大约3万行。

mediaiduseriduid都是索引。

服务器? 8个核心x 3,2,16gb ram。可扩展的云。平均负荷很好。不超过20%cpus

编辑:解释选择返回以下数据:

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

2 个答案:

答案 0 :(得分:0)

您可以将查询更改为左连接

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);

答案 1 :(得分:0)

最后,我重新编写查询以下载当前用户ID的两个数据。然后在php中计算它。现在它很快。 x10更快。现在好了。