执行一条 Mysql 语句用了 40 分钟,好慢啊

2018-02-24 11:22:57 +08:00
 frozenway

mysql> SELECT count(*) AS tt,agent,ip,isp FROM sh_agent_log GROUP BY ip ORDER BY tt DESC LIMIT 20;

...

20 rows in set (40 min 27.17 sec)

想统计一下访问日记里面访问次数最多的 IP,没想到要查询这么久,一共有 30 万条数据而已,请问怎么优化查询

10775 次点击
所在节点    MySQL
56 条回复
abusizhishen
2018-02-24 13:00:21 +08:00
事实上年的
abusizhishen
2018-02-24 13:00:54 +08:00
😂😂😂打错了,试试上面的
lygmqkl
2018-02-24 13:07:09 +08:00
mysql 金句 用小结果驱动大结果。 当然索引之类的 都要做到位,其实在业务逻辑层面上可以 规避这些风险的。
liuxu
2018-02-24 13:07:11 +08:00
看上去直接原因还是临时磁盘表用的太多,io 跟不上,换 SSD 会好些。但正确的姿势还是应该加索引了。。
alcarl
2018-02-24 13:19:08 +08:00
@cisisustring 不会,mysql 5.7 以下默认没有开这个检查
alcarl
2018-02-24 13:22:32 +08:00
默认配置的话,可能是 sort 的 buff 有点小,innodb 的 buf 也有点小,都有影响,调大一点会好一些
laqow
2018-02-24 13:33:18 +08:00
tt 和 ip 的类型改一下,改成定长字符串或整型,或算一列 hash 再建索引,应该不会慢
ty89
2018-02-24 13:40:17 +08:00
建议楼主顺便把 create table sh_agent_log 的结果贴一下
justfindu
2018-02-24 13:43:38 +08:00
不加索引也不应该这么慢啊 才 30W
picasso250
2018-02-24 13:54:03 +08:00
如果 sh_agent_log 这个的数据还会不断增长,那么建议你用 redis 存 ip 记录吧.
这个需要单独处理.

如果 sh_agent_log 不再增长,你就是单独拿出来分析一下. 换个 SSD 吧.
woscaizi
2018-02-24 14:15:47 +08:00
看看类似 select * from table limit 0,20 的时间如何,然后再慢慢加 group by,看看哪个条件会导致慢。
另外,磁盘 io 怎么样,是 ssd 还是 hdd ?
rrfeng
2018-02-24 14:22:30 +08:00
30w …… 给我个文本文件我用 awk 1s 内给你跑出来
yaoweilei
2018-02-24 14:35:53 +08:00
30 万条,应该 40ms 内查出来哈,40 分钟实在是敬佩楼主的耐心。
chcx
2018-02-24 14:39:16 +08:00
佩服耐心。 index.
frozenway
2018-02-24 15:05:00 +08:00
@abusizhishen 你这个语句执行报错了
hanqi7012
2018-02-24 15:12:35 +08:00
40 分钟三十万有点慢啊
那天下的库 4 亿也没这么慢啊
frozenway
2018-02-24 15:19:43 +08:00
加了索引,然而还是很慢
wooyu
2018-02-24 15:41:44 +08:00
@hanqi7012 我已经报警了
SoulSleep
2018-02-24 17:00:49 +08:00
贴 explain 你发 sql 我只能吐槽 排序 group limit......能不慢吗…… 40min ?那就太多了
shyy06
2018-02-24 17:16:56 +08:00
Mysql 从删库到跑路

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

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

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

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

© 2021 V2EX