我有一个应用程序,它有一个安装表和一个使用表。
我想检查安装信息,看看有多少仍然处于事件状态
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 只读副本。暂停。游戏结束
所以问题是两个表都有大约 100 万行。上述字段均已建立索引。问题是独特的以及在哪里杀死它。
是否可以在连接之前首先进行查询,并使用其中的数据?如果是这样 - 它叫什么?或者我应该面对它。使用 SQL 来做这件事无论如何都会自杀 - 最好只使用 Web 应用程序或其他引擎来保存要报告的数据?>
注意Innodb、mysql 5.6
最佳答案
您可以首先运行 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
另一种方法是运行解释来查看 mysql 计划如何运行查询来查看它使用的索引 http://dev.mysql.com/doc/refman/5.7/en/using-explain.html .
您还可以尝试内部联接并使用联合添加缺少的字段。
关于mysql - 怎么可能有比左外连接更高效的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33909414/