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
2
3
4
5
如何定位慢查询
通过EXPLAIN查询该语句是否走了索引,没走索引说明走了全表扫描
注意:生产环境一般不允许这样做,生产环境一般会通过自动化平台,通过可视化界面来看
EXPLAIN 如何使用?
使用方式:EXPLAIN SELECT * FROM test WHERE age = 10
EXPLAIN 中的Type字段含义
type = all:直接全表扫描数据, 效率极低
type = index:需要优化,虽然也是走索引,但表示全表扫描【索引】文件,不是扫数据
type = range:sql最低的满足条件是range,只查询给定范围的行,使用一个索引来选择行
type = ref:一般的要求该级别,当字段加了普通索引,而条件恰好也是该字段,则就是ref类型,比如使用name = ‘hbz’这个条件,而name创建了普通索引,此时就是ref
type = eq_ref:通过主键 或 唯一索引进行关联表查询时就是eq_ref,算是除了const最好的结果了
type = const:性能极高的级别,根据主键索引id找,一般都是const,无需优化
Mysql为什么做联合索引要遵从最佳左前缀法则?
联合索引会以前缀优先
如果联合顺序是 name, age, position
举例:
// 顺序: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'