1. 慢查询(MySQL)
1.1 如何找到慢SQL
- 慢查询日志
1)MySQL服务器在命令执行前后计算每条命令的执行时长,超过某个阈值记录下来 - 获取慢查询日志
set global slow_query_log=1
slow_query_log_file
long_query_time 10
第一行:记录时间
第二行:用户名,用户IP和线程ID
第三行:执行花费时间
第四行:时间戳
第五行:具体的SQL语句
- 对单条慢SQL进行分析:explain
1)Type:搜索数据的方法,const是直接按主键或唯一键读取;eq_ref用于联表查询的情况,按联表的主键或唯一键联合查询;ref(每次只匹配少数行,使用左覆盖索引或者非主键或者非唯一键);range:索引的范围查找;ALL:全表查询。
2)Extra:using index,索引中包含查询的所有列,不需要回表,使用覆盖索引。using where 需要回表
3)Key :实际使用的索引
1.2 慢SQL的原因
1.未建索引:整张表没有建索引;
- 对经常使用的列建立索引(索引一定是非空且唯一的)
- 索引未命中:有索引,但是部分查询条件下索引未命中;
1)模糊查询:使用了like ’ %T ’ 进行模糊查询,使得左边是模糊的,只能进行全表搜索。
2)or筛选:使用or进行筛选,当or两边有一边没有索引时,都不进行索引搜索。
3)使用复合索引:使用复合索引,不满足最左匹配原则
4)索引参与函数:where当中索引列参与运算和使用函数,索引进行失效 - 搜索了额外的非必要字段,导致回表;
- 排序,聚合导致慢查询;
- 相同内容多次查询数据库;
- 未消限制搜索范围或者限制的搜索范围在预期之外,导致全部扫描;
1.3 如何解决慢SQL问题
- 分库分表:冷数据和热数据分离
- 多层嵌套查询变为多次查询
- in子查询影响查询的性能,使用join方法代替
- 一次查询数量过于庞大,查分为多次查询,再进行拼装
- 使用了方向查询,查询的对象过多。
2. 锁机制
慢SQL优化实战笔记