<返回更多

MYSQL最朴素的监控方式

2022-08-13    京东云
加入收藏

对于当前数据库的监控方式有很多,分为数据库自带、商用、开源三大类,每一种都有各自的特色;而对于MySQL数据库由于其有很高的社区活跃度,监控方式更是多种多样,不管哪种监控方式最核心的就是监控数据,获取得到全面的监控数据后就是灵活的展示部分。那我们今天就介绍一下完全采用mysql自有方式采集获取监控数据,在单体下达到最快速、方便、损耗最小。

本次文章完全使用mysql自带的show命令实现获取,从connects、buffercache、lock、SQL、statement、Database throughputs、serverconfig7大方面全面获取监控数据。

1 连接数(Connects)

2 缓存(bufferCache)

3 锁(lock)

备注:锁等待统计得数量为累加数据,每次获取得时候可以跟之前得数据进行相减,得到当前统计得数据

4 SQL

备注:当mysqldumpslow命令执行失败时,将慢日志同步到本地进行格式化处理。

5 statement

6 吞吐(Database throughputs)

7 数据库参数(serverconfig)

show variables

8 慢SQL

慢SQL指的是MySQL慢查询,具体指运行时间超过long_query_time值的SQL。

我们常听MySQL中有二进制日志binlog、中继日志relaylog、重做回滚日志redolog、undolog等。针对慢查询,还有一种慢查询日志slowlog,用来记录在MySQL中响应时间超过阀值的语句。慢SQL对实际生产业务影响是致命的,所以测试人员在性能测试过程中,对数据库SQL语句执行情况实施监控,给开发提供准确的性能优化意见显得尤为重要。那怎么使用Mysql数据库提供的慢查询日志来监控SQL语句执行情况,找到消耗较高的SQL语句,以下详细说明一下慢查询日志的使用步骤:

常见用法:

  1. 取出使用最多的10条慢查询
  2. ./mysqldumpslow -s c -t 10 /export/data/mysql/log/slow.log
  3. 取出查询时间最慢的3条慢查询
  4. ./mysqldumpslow -s t -t 3 /export/data/mysql/log/slow.log

注意: 使用mysqldumpslow的分析结果不会显示具体完整的sql语句,只会显示sql的组成结构;

假如: SELECT FROM sms_send WHERE service_id=10 GROUP BY content LIMIT 0, 1000;

mysqldumpslow命令执行后显示:

Count: 2 Time=1.5s (3s) Lock=0.00s (0s) Rows=1000.0 (2000), vgos_dba[vgos_dba]@[10.130.229.196]SELECT FROM sms_send WHERE service_id=N GROUP BY content LIMIT N, N

mysqldumpslow的分析结果详解:

通过这个工具就可以查询出来哪些sql语句是慢SQL,从而反馈研发进行优化,比如加索引,该应用的实现方式等。

常见慢SQL排查

  1. 不使用子查询
  2. SELECT FROM t1 WHERE id (SELECT id FROM t2 WHERE name=’hechunyang’);
  3. 子查询在MySQL5.5版本里,内部执行计划器是这样执行的:先查外表再匹配内表,而不是先查内表t2,当外表的数据很大时,查询速度会非常慢。
  4. 在MariaDB10/MySQL5.6版本里,采用join关联方式对其进行了优化,这条SQL会自动转换为 SELECT t1. FROM t1 JOIN t2 ON t1.id = t2.id;
  5. 但请注意的是:优化只针对SELECT有效,对UPDATE/DELETE子 查询无效, 生产环境尽量应避免使用子查询。
  6. 避免函数索引
  7. SELECT FROM t WHERE YEAR(d) >= 2016;
  8. 由于MySQL不像Oracle那样⽀持函数索引,即使d字段有索引,也会直接全表扫描。
  9. 应改为 > SELECT FROM t WHERE d >= ‘2016-01-01’;
  10. 用IN来替换OR低效查询
  11. 慢SELECT FROM t WHERE LOC_ID = 10 OR LOC_ID = 20 OR LOC_ID = 30;
  12. 高效查询 > SELECT FROM t WHERE LOC_IN IN (10,20,30);
  13. LIKE双百分号无法使用到索引
  14. SELECT FROM t WHERE name LIKE ‘%de%’;
  15. 使用SELECT FROM t WHERE name LIKE ‘de%’;
  16. 分组统计可以禁止排序
  17. SELECT goods_id,count() FROM t GROUP BY goods_id;
  18. 默认情况下,MySQL对所有GROUP BY col1,col2…的字段进⾏排序。如果查询包括GROUP BY,想要避免排序结果的消耗,则可以指定ORDER BY NULL禁止排序。
  19. 使用SELECT goods_id,count() FROM t GROUP BY goods_id ORDER BY NULL;
  20. 禁止不必要的ORDER BY排序
  21. SELECT count(1) FROM user u LEFT JOIN user_info i ON u.id = i.user_id WHERE 1 = 1 ORDER BY u.create_time DESC;
  22. 使用SELECT count(1) FROM user u LEFT JOIN user_info i ON u.id = i.user_id;

9 总结

作者:安甲舒

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>