求高手帮助解决 MYSQL 查询性能问题

2016-08-02 23:17:31 +08:00
 monkeyk

在 MYSQL 数据库中有两个表
表 1: application_instance (id, instance_name,archived,private_instance ) 127 条数据
表 2: frequency_monitor_log(id,archived,instance_id) 2772140 条数据

现在有如下关联统计查询 SQL

select count(ai.id) from frequency_monitor_log ai where ai.archived = 0
and exists ( select a.id from application_instance a where a.archived = 0 and a.private_instance = 0 and a.id = ai.instance_id )

查询时间竟然要 10 秒, 如何优化? 求助
已知 instance_id, id, archived, private_instance 字段都已经建立了索引. 尝试使用 inner join 等方式, 结果也一样很慢.

1073 次点击
所在节点    数据库
6 条回复
xujif
2016-08-02 23:59:21 +08:00
换成 join 应该不会太慢,你这个语句更好的是把 exists 换成 where ai.instance_id in ( select a.id from application_instance a where a.archived = 0 and a.private_instance = 0) 这个语句不会导致 n*m
billlee
2016-08-03 00:03:36 +08:00
SELECT count(1) FROM frequency_monitor_log AS a JOIN application_instance AS b ON a.instance_id = b.id WHERE a.archived = 0 AND b.archived = 0 AND b.private_instance = 0;
对 frequency_moniter_log 建立 (instance_id, archived) 索引,而不是对两个字段单独建索引。
id 请设置为主键。
遇到问题先 EXPLAIN.
ferock
2016-08-03 00:31:05 +08:00
干嘛都不用 count(*)
monkeyk
2016-08-03 09:26:52 +08:00
@billlee 感谢, 测试了现在只需要 0.8 秒; 之前用 explain 查看发现用了全表扫描.
monkeyk
2016-08-03 09:27:30 +08:00
@xujif 正确, 用了你的办法, 0.8 秒
li24361
2016-08-03 09:53:04 +08:00
外表大内表小,用 in ,反之用 exists

额。一二楼都说的很明白了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/296686

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX