当前位置:网站首页>【HBZ分享】云数据库如何定位慢查询

【HBZ分享】云数据库如何定位慢查询

2022-07-06 04:16:00 hbz-

如何配置Mysql慢查询

1. 查询慢日志相关信息:SHOW VARIABLES LIKE '%query%'
2. 开启慢日志记录文件:set global slow_query_log = 'ON'
3. 记录慢日志的文件名:slow_query_log_file
4. 配置达到慢查询时间:set global long_query_time = 1   // 修改慢查询时间1s,即查询超过1s就记录到慢查询日志中
5. 注意:修改慢查询时间后,记得需要重新连接才能生效

如何定位慢查询

  1. 通过EXPLAIN查询该语句是否走了索引,没走索引说明走了全表扫描
  2. 注意:生产环境一般不允许这样做,生产环境一般会通过自动化平台,通过可视化界面来看

EXPLAIN 如何使用?

  1. 使用方式:EXPLAIN SELECT * FROM test WHERE age = 10

EXPLAIN 中的Type字段含义

  1. type = all:直接全表扫描数据, 效率极低
  2. type = index:需要优化,虽然也是走索引,但表示全表扫描【索引】文件,不是扫数据
  3. type = range:sql最低的满足条件是range,只查询给定范围的行,使用一个索引来选择行
  4. type = ref:一般的要求该级别,当字段加了普通索引,而条件恰好也是该字段,则就是ref类型,比如使用name = ‘hbz’这个条件,而name创建了普通索引,此时就是ref
  5. type = eq_ref:通过主键 或 唯一索引进行关联表查询时就是eq_ref,算是除了const最好的结果了
  6. type = const:性能极高的级别,根据主键索引id找,一般都是const,无需优化

Mysql为什么做联合索引要遵从最佳左前缀法则?

  1. 联合索引会以前缀优先
  2. 如果联合顺序是 name, age, position
  3. 举例:
// 顺序:name, age, postion -->由于条件是按照联合索引顺序,所以会触发ref索引级别
SQL: SELECT name, age FROM people WHERE name = 'hbz' and age = 21 and positon = 'tetst'

// 只有name -->由于条件带有前缀name,所以会触发ref索引级别
SQL: SELECT name, age FROM people WHERE name = 'hbz'

// 只有name, position -->由于条件带有前缀name,所以会触发ref索引级别
SQL: SELECT name, age FROM people WHERE name = 'hbz' and positon = 'tetst'

// 只有position, 没有name -->由于没有前缀name,所以不会触发索引
SQL: SELECT name, age FROM people WHERE positon = 'tetst'

// 有name,但和联合索引顺序不一致 -->条件有name字段,所以会触发索引,虽然不是按顺序,但是mysql底层会把name给优化放到前面
SQL: SELECT name, age FROM people WHERE positon = 'tetst' and name = 'hbz' 
  1. 综上所述,所谓最左前缀法则,就是,如果where后面带有name,那么必然会走索引,name的顺序在哪里都无所谓,因为mysql底层会优化,把name放到最前面。但如果没有name,联合索引的其他字段顺序对也是无法走索引的。这就叫最佳做前缀法则,联合索引的开头字段必须存在。
原网站

版权声明
本文为[hbz-]所创,转载请带上原文链接,感谢
https://blog.csdn.net/a645293829/article/details/125508852