2023-01:MySql优化相关

记一下MySQL的优化相关信息

1、索引失效

1. MySQL认为不需要用索引
2. B+树的数据结构
	1. like左模式,模糊搜索前缀/左侧进行模糊搜索,索引失效(B+树是将数据从左往右依次确定值,然后进行树化)
	2. 联合索引最左匹配原则
3. 对索引进行了额外的操作,导致在使用索引前需要多执行一步,索引失效 
	1. 索引字段上添加函数
	2. 索引字段上使用数学计算
4. 使用了or字段(需要测试)
5. 字段存在null,mysql解析器强制不使用索引(需测试一下)

2、多表关联

  1. on后的关联字段,必须加索引(阿里巴巴代码规范有提到)
  2. 关联表编码规范一致,在2022遇到过一个表是utf8,另一个表是character
  3. 关联字段数据类型一致,在2022同样遇到过一个字段是int,另一个字段是varchar
  4. 大表驱动小表,左表数据量比右表多,使得大表驱动小表,这样效率更高
  5. 使用straight_join,可能存在MySQL修改左右表顺序的情况,这时,查看真实执行的顺序,改变下表关联的顺序,查看效率问题,最好大表驱动小表
  6. where后的条件顺序,会影响到效率,要确保左表的条件在右表的条件前面
  7. 表连接顺序影响很大,需要保证从左往右,尽可能地保证每一个表都能限制最大的范围。比如说,AB表关联,查询条件A.a能将范围缩小到10%数据,B.b能将范围缩小到1%的数据,那么B straight_join A,很可能效率更高
  8. on后的关联字段的索引失效:函数、数学计算、左模糊等

3、其他

  1. 避免回表,使用覆盖索引,也就是说所有的查询条件都在索引上,或者是查找出主键列表后,用主键列表查找出对应的数据,也就是通过聚簇索引查找,这样更快
  2. 如果是生产环境,需要检测下mysql缓存池的配置,是否进行过配置
  3. 分页查询慢,可以通过,先查询主键,然后通过主键,同第一条
  4. 最好的查询效率是,小表驱动大表,这样先查出小表中的数据,然后通过聚簇索引,查找大表中的对应数据,效率更高

4、需要测试

  1. 如果是联合索引,要注意排序是否与索引得 asc desc 一致
  2. not exist,好像相比not in,使用的场景的区分是左右表大小,因为一个是左表驱动,一个是右表驱动,
  3. 使用了or字段,是否会一定不走索引,且创建联合索引,就会使用对应的联合索引,参见:知乎、其他

5、其他

  1. 查看实际执行的sql
# 获取数据库执行的sql历史语句
set global log_output = 'TABLE';
set global general_log = 'ON';
set global general_log = 'OFF';

# 2、查询
select *
from
    mysql.general_log
where argument like '%select%'
  and argument not like '%ApplicationName=DataGrip%'
order by event_time desc; # 我使用的是 idea 家族中的 DataGrip,不需要对 blob 进行处理

# 3、清空表(delete对于这个表,不允许使用,只能用truncate)
set global general_log = 'OFF';
truncate table mysql.general_log;
posted @ 2023-06-11 01:08  season-qd  阅读(20)  评论(0编辑  收藏  举报