我有一个应用程序,它有一个安装表和一个使用表。
我想查看安装信息,看看有多少仍然有效
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
答案 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索引。
您还可以尝试内部联接并使用联合添加缺少的字段。