ITPub博客

首页 > 数据库 > 数据库开发技术 > 强迫症看不了一点--官方慢查询日志配置这方案

强迫症看不了一点--官方慢查询日志配置这方案

原创 数据库开发技术 作者:丁奇3306 时间:2024-09-13 09:28:51 0 删除 编辑

开篇打人:

1.《MySQL综合题&解》直播片段:8.0的一个排序性能优化原理

2. 写一个符合大厂MySQL内核主干标准的功能,难不难?


起因是上一篇文章后,在群里发起了这么个问题:

这里说的有损是什么意思呢?相关知识点:
1. log_queries_not_using_indexes 表示记录所有没有使用索引的语句。就是说即使不是慢查询,只要没有使用索引,记录到慢查询;

2. 监控语句都是查的系统schema里面的统计信息,这些表没有索引,如果开了log_queries_not_using_indexes,就导致监控用的查询语句都会记录到慢查询日志,导致慢查询日志特别多,而且很多都是这种需要无视的语句。干扰诊断。

3. log_throttle_queries_not_using_indexes表示每分钟允许记录到 slow log 的且未使用索引的 SQL 语句次数,超过的部分则不记录。

4. min_examined_row_limit 表示查询扫描行数少于这个值的语句不记入慢查询日志。

所以就有了两个配套方案:

A: 先礼后兵版:
log_queries_not_using_indexes 配合 
log_throttle_queries_not_using_indexes,解决慢查询日志过多的问题。方案问题:因为log_throttle是无差别统计,也就是说,触发log_throttle后, 如果有真实的查询用户表的无法使用索引的语句,也不记录了。

B: 殃及池鱼版:
log_queries_not_using_indexes 配合 min_examined_row_limit。比如min_examined_row_limit配置200,来拦掉扫描行数少于200行的所有查询。但是这个可能会导致漏过一些需要关注的业务语句,详见 介绍MySQL里一个不该用的参数

后续群里讨论,还有其他的一些方案:
C: 釜底抽薪版:直接不开log_queries_not_using_indexes 。解决不掉问题,就解决掉提出问题的参数。


D:韬光养晦版:上线的时候先开log_queries_not_using_indexes ,不配合其他参数。观察一段时间,把上线初期发现的业务未使用索引的语句先排查和让业务优化,稳定后,再关闭这个参数。

E: 瓮中捉鳖版:先把所有不使用查询的语句都记下来,分析的时候根据sql语句解析,忽略监控类的语句,只抽取和分析业务语句。

以上是从现有官方版本代码能够实施的运维方案。

如果考虑可以修改源码,还有两个思路可选:

F:没有成语版:允许设置指定用户名,这些用户名的SQL语句都不记入慢查询。这样可以在数据库端把监控的用户账号配置进去。

G:里应外合版:log_queries_not_using_indexes目前是global参数,改成global+session,这样监控工具连接的时候,在自己的线程里先把这个设置成off,不影响其他线程。这个内核改动量很小,只是需要监控平台配合。

如果你是架构决策者,你会选择哪个版本呢?评论区见

原文作者:丁奇3306;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2024-08-07

  • 博文量
    104
  • 访问量
    44852