mysql 实例怎么自动识别热点数据?

2020-02-12 11:56:10 +08:00
 ksedz

现在能想到

  1. 定时采集 Innodb buffer pool 的数据做分析
  2. 镜像 mysql 流量,提取 SQL 查询语句,对查询条件做分析得到热点的查询条件

前者比较精确,数据库负担大,后者对数据库侵入小,但实现复杂些,得到的也是查询条件

有没有其他思路?

3047 次点击
所在节点    程序员
8 条回复
leviathan0992
2020-02-12 12:24:48 +08:00
需求是什么?
ksedz
2020-02-12 13:26:37 +08:00
@leviathan0992 给 DBA 用的分析工具需要做识别热点数据的需求,现在都是要从使用者(开发)的业务逻辑去判断热点,就想能不能通过数据库使用记录、返回数据、状态信息等来做。
ps1aniuge
2020-02-12 16:58:39 +08:00
没必要,识别热数据应该在:
1 数据库前面加个 redis,
2 然后客户端弄个读取记数。每读取一次就加一。
3 然后每天半夜,用 redis 客户端+脚本,上来收热数据的记录。
ivyliner
2020-02-12 17:23:20 +08:00
从 mysql 的 general log 中分析 ? 不过日志量可能会比较大
yidinghe
2020-02-12 17:29:26 +08:00
脱离 SQL 语句去观察热点数据意义不大。一般就是观察下执行最频繁的查询和更新语句就可以了。
ksedz
2020-02-12 18:03:20 +08:00
@ps1aniuge 拿结果集的问题是很多查询对数据表的访问不能反应在结果集上,当然也得看实际数据情况。而且支撑的业务较多,开发用什么的都有,在 client 端做操作不太现实。

@ivyliner 就是方案 2 吧,用分析网络流量替换了 general log,这个不好解决多个条件命中相同数据的问题。

@yidinghe 现在已经实现了 SQL、SQL 模板、SQL 类型等的执行次数统计和排序,就是想更进一步,从数据的角度去回答使用者更常用哪些数据。“脱离 SQL 语句去观察热点数据意义不大”,我再考虑下这样做的价值,谢谢。
snappyone
2020-02-12 18:58:14 +08:00
buffer pool 里面数据怎么采集啊?况且里面数据也不一定准吧
ps1aniuge
2020-02-14 18:17:15 +08:00
@ksedz
多查询对数据表的访问不能反应在结果集上---------世界上没有你说的这种。
1 费劲的查询却不出结果。
2 出了结果,却不是想要的。
3 想要的结果,却在 buffer pool 中,不知道。
4 知道了在 buffer pool 中的结果,必须经过读它,却把 buffer pool 命中率搞乱了。

所以说,redis 法是最好的方法。比分析 log 好多了。却不会影响 buffer pool。
在 redis 中设定好 all key lru,想要结果大些,就把内存设定大些。想要结果小些,就把内存设定小些。
每天凌晨 3 点抓取当天的统计结果,入表。n 天,平均值,最大,最小,一出。

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

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

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

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

© 2021 V2EX