2023-01:MySql优化相关
记一下MySQL的优化相关信息
1、索引失效
1. MySQL认为不需要用索引
2. B+树的数据结构
1. like左模式,模糊搜索前缀/左侧进行模糊搜索,索引失效(B+树是将数据从左往右依次确定值,然后进行树化)
2. 联合索引最左匹配原则
3. 对索引进行了额外的操作,导致在使用索引前需要多执行一步,索引失效
1. 索引字段上添加函数
2. 索引字段上使用数学计算
4. 使用了or字段(需要测试)
5. 字段存在null,mysql解析器强制不使用索引(需测试一下)
2、多表关联
- on后的关联字段,必须加索引(阿里巴巴代码规范有提到)
- 关联表编码规范一致,在2022遇到过一个表是utf8,另一个表是character
- 关联字段数据类型一致,在2022同样遇到过一个字段是int,另一个字段是varchar
- 大表驱动小表,左表数据量比右表多,使得大表驱动小表,这样效率更高
- 使用straight_join,可能存在MySQL修改左右表顺序的情况,这时,查看真实执行的顺序,改变下表关联的顺序,查看效率问题,最好大表驱动小表
- where后的条件顺序,会影响到效率,要确保左表的条件在右表的条件前面
- 表连接顺序影响很大,需要保证从左往右,尽可能地保证每一个表都能限制最大的范围。比如说,AB表关联,查询条件A.a能将范围缩小到10%数据,B.b能将范围缩小到1%的数据,那么B straight_join A,很可能效率更高
- on后的关联字段的索引失效:函数、数学计算、左模糊等
3、其他
- 避免回表,使用覆盖索引,也就是说所有的查询条件都在索引上,或者是查找出主键列表后,用主键列表查找出对应的数据,也就是通过聚簇索引查找,这样更快
- 如果是生产环境,需要检测下mysql缓存池的配置,是否进行过配置
- 分页查询慢,可以通过,先查询主键,然后通过主键,同第一条
- 最好的查询效率是,小表驱动大表,这样先查出小表中的数据,然后通过聚簇索引,查找大表中的对应数据,效率更高
4、需要测试
- 如果是联合索引,要注意排序是否与索引得 asc desc 一致
- not exist,好像相比not in,使用的场景的区分是左右表大小,因为一个是左表驱动,一个是右表驱动,
- 使用了or字段,是否会一定不走索引,且创建联合索引,就会使用对应的联合索引,参见:知乎、其他
5、其他
- 查看实际执行的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;
梦想不多,口袋有糖,卡里有钱,未来有你