mysql - 怎么可能有比左外连接更高效的查询

标签 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 只读副本。暂停。游戏结束

所以问题是两个表都有大约 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/

相关文章:

mysql - 如何选择一列日期并使用它来驱动第二个 SELECT 语句?

php - WordPress 中的 Ajax 和 php 删除错误

mysql - 绑定(bind)值 INSERT INTO mysql perl

MYSQL 查询并比较值(如果找到多行)

mysql - 如何通过 2 个外键访问同一个表来获取 MySQL 中的信息?

mysql - 在不填充数据的脚本中加载数据本地INFILE(mysql)

mysql - 将 2 个查询合并为一个查询

mysql - 使用 Scheme/Ypsilon 引擎并行访问 MySQL

mysql - 如何在排序的顶部获得 NULL?

php - 在嵌入视频代码上使用 preg_match 来提取其 id URL