如何比左外连接更有效的查询

时间:2015-11-25 05:57:14

标签: mysql

我有一个应用程序,它有一个安装表和一个使用表。

我想查看安装信息,看看有多少仍然有效

select i.source,count(i.app_id),count(distinct u.app_id) from appinstall i
left outer join appuse u 
on i.app_id = u.app_id
where a.timestamp > '2015-01-01 00:00:00'
and u.timestamp > (last 3 days)
group by i.source

Viola,我有效地杀死了我的RDS读取副本。超时。 GAMEOVER

所以问题是两个表都是大约100万行。以上字段均已编入索引。问题是不同的,并且正在杀死它。

是否可以在加入之前首先进行查询,并使用其中的数据?如果是这样 - 它叫什么?或者我应该面对它。无论什么会自杀,最好只使用一个webapp或其他引擎来保存要报告的数据?

注意Innodb,mysql 5.6

1 个答案:

答案 0 :(得分:1)

您可以先运行where子句,然后使用嵌套选择来减少表。

SELECT i.source, COUNT(i.app_id), COUNT(distinct u.app_id) FROM 
( SELECT i.app_id, i.source FROM appinstall i where i.timestamp > '2015-01-01 00:00:00' ) AS i
LEFT OUTER JOIN
( SELECT u.app_id FROM appuse u WHERE u.timestamp > (last 3 days)) AS u
ON i.app_id = u.app_id
GROUP BY i.source

另一种方法是运行explain来查看mysql如何计划运行查询以查看它使用的http://dev.mysql.com/doc/refman/5.7/en/using-explain.html索引。

您还可以尝试内部联接并使用联合添加缺少的字段。