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 万条数据而已,请问怎么优化查询
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 万条数据而已,请问怎么优化查询
|
1
楼主的耐心可以的……
|
|
raccooncityFeb 24, 2018 via iPhone
2
所以建索引了吗。。。
|
|
zhs227Feb 24, 2018
3
不是应该直接 Ctrl+C 了吗。 耐心不错。explain 一下,看看是不是需要给 IP 字段加上索引。
|
|
BBCCBBFeb 24, 2018
4
厉害厉害,可以可以,666
|
|
toxicantFeb 24, 2018
6
index 是个好东西啊.........
|
|
LeeSeoungFeb 24, 2018
7
- -你确定不检查下么,不应该这么慢的。。
|
|
owenliangFeb 24, 2018
8
group by 本来就是全量计算,最后聚合后的桶数量决定了排序的耗时。
你机器估计很普通吧? 30 万对于生产服务器做统计也是小 case。 |
|
SourceManFeb 24, 2018
9
没有什么是加一台机器不能解决的,如果有,加两台!
|
|
10
|
|
murmurFeb 24, 2018
11
40w 数据这个速度怕是在软盘上跑出来的吧
|
|
TinkFeb 24, 2018
13
索引
|
|
cisisustringFeb 24, 2018
14
mysql> SELECT count(*) AS tt,agent,ip,isp FROM sh_agent_log GROUP BY ip ORDER BY tt DESC LIMIT 20;
我是分割线 只 gropu by ip 不会报错吗? |
|
HTNecroFeb 24, 2018
16
没啥说的,索引
|
|
dobeleeFeb 24, 2018
17
40min 还没断开,楼主耐力惊人,佩服。
|
|
gbinFeb 24, 2018 via Android
18
佩服
|
|
abusizhishenFeb 24, 2018 via Android
19
建议 IP 转成整型存储,并加索引,以降低索引长度提高索引效率
|
|
abusizhishenFeb 24, 2018 via Android
20
|
|
abusizhishenFeb 24, 2018 via Android
21
事实上年的
|
|
abusizhishenFeb 24, 2018 via Android
22
😂😂😂打错了,试试上面的
|
|
lygmqklFeb 24, 2018
23
mysql 金句 用小结果驱动大结果。 当然索引之类的 都要做到位,其实在业务逻辑层面上可以 规避这些风险的。
|
|
liuxuFeb 24, 2018
24
看上去直接原因还是临时磁盘表用的太多,io 跟不上,换 SSD 会好些。但正确的姿势还是应该加索引了。。
|
|
alcarlFeb 24, 2018 via Android
25
@cisisustring 不会,mysql 5.7 以下默认没有开这个检查
|
|
alcarlFeb 24, 2018 via Android
26
默认配置的话,可能是 sort 的 buff 有点小,innodb 的 buf 也有点小,都有影响,调大一点会好一些
|
|
laqowFeb 24, 2018 via Android
27
tt 和 ip 的类型改一下,改成定长字符串或整型,或算一列 hash 再建索引,应该不会慢
|
|
ty89Feb 24, 2018
28
建议楼主顺便把 create table sh_agent_log 的结果贴一下
|
|
justfinduFeb 24, 2018
29
不加索引也不应该这么慢啊 才 30W
|
|
picasso250Feb 24, 2018
30
如果 sh_agent_log 这个的数据还会不断增长,那么建议你用 redis 存 ip 记录吧.
这个需要单独处理. 如果 sh_agent_log 不再增长,你就是单独拿出来分析一下. 换个 SSD 吧. |
|
woscaiziFeb 24, 2018 via iPhone
31
看看类似 select * from table limit 0,20 的时间如何,然后再慢慢加 group by,看看哪个条件会导致慢。
另外,磁盘 io 怎么样,是 ssd 还是 hdd ? |
|
rrfengFeb 24, 2018
32
30w …… 给我个文本文件我用 awk 1s 内给你跑出来
|
|
yaoweileiFeb 24, 2018
33
30 万条,应该 40ms 内查出来哈,40 分钟实在是敬佩楼主的耐心。
|
|
chcxFeb 24, 2018
34
佩服耐心。 index.
|
|
35
@abusizhishen 你这个语句执行报错了
|
|
hanqi7012Feb 24, 2018 via Android
36
40 分钟三十万有点慢啊
那天下的库 4 亿也没这么慢啊 |
|
37
加了索引,然而还是很慢
|
|
SoulSleepFeb 24, 2018 via iPhone
39
贴 explain 你发 sql 我只能吐槽 排序 group limit......能不慢吗…… 40min ?那就太多了
|
|
shyy06Feb 24, 2018
40
Mysql 从删库到跑路
|
|
GeekCatFeb 24, 2018
41
30 万数据 40min....敢问硬盘 rpm 几百?
|
|
abusizhishenFeb 24, 2018 via Android
42
@frozenway 我手机上发的,错误贴出来
|
|
abusizhishenFeb 24, 2018 via Android
43
@frozenway 第二个 select 里少了个 IP 字段,加上试试
|
|
fireappFeb 24, 2018 via Android
44
讲真,100w 条文本,awk 也就一分钟
|
|
aiasFeb 24, 2018
45
好多懂 MySQL 的。。
|
|
wwww961hFeb 24, 2018
46
30W 数据 40 分钟,你这机器性能挺好
|
|
cxh116Feb 24, 2018 via Android
47
有主键吗? count id,别 *
|
|
troywinterFeb 24, 2018
48
加索引,还有 late row query
|
|
CodemonkeyMFeb 24, 2018 via Android
49
不要*,加索引。
|
|
50
|
|
fatpaFeb 24, 2018
51
加个索引不好么
|
|
CodemonkeyMFeb 25, 2018 via Android
52
@wayne1027 unless you are using MyISAM....
|
|
usednameFeb 25, 2018 via iPhone
53
30w 用得着加索引?明显是机器烂的不行
|
|
snBDX1b0jJM4ogKdFeb 25, 2018 via Android
54
@CodemonkeyM @wayne1027 count(*)实际上是计数所有不全为 null 的列。当然会比 count(1)慢一些
|
|
dujiangboApr 2, 2018 via Android
55
是不是存储引擎的原因?
前两天我的库 COUNT 一下都几十秒,而且运行越来越慢,一怒之下都改成了 myisam,速度立马飞起。 我的机器就是普通的 PC,数据几十万条吧。 |
|
YMBApr 21, 2018
56
数据库做查询的话,建议分表。
或者把数据同步到 es 去查 |