mysql优化小技巧
需要提前掌握的知识:关于explain显示的字段的具体含义;简单介绍一下
id:执行顺序,id越大,执行优先级越高,id相等,顺序执行(从上到下)
select_type:查询类型,有simple、subquery、union、 derived等等
table:查询表名
type:类型(重要字段,判断性能的标准之一)(大致的排序,中间有其他类型,此处为常见类型)system>const>eq_ref>ref>range>index>all
possible_keys:可能涉及到的索引
key:用到的索引
key_len:可能的索引长度(可用来判断用到了覆合索引的几个字段)
ref:参数的类型,如果where字段里面有等于,并且加入了判断,就是const
rows:sql语句的扫描行数
extra:附加信息(判断是否优化的标准之一)using where、using index(看见这个说明用到索引,性能不错)、using filesort(需要优化)、using temporary(紧急优化)
一、优化技巧
转载一下别人的博客
https://blog.csdn.net/qq_41408088/article/details/105445629
(1)小表驱动大表
例如:学生信息(包含年级信息id 1)、年级信息(年级信息id 1与年级名 大一 之类)
明显学生信息表是大表、年级信息表是小表
最好的情况是 年级信息表驱动学生信息表
create index idx_student_classid;
select * from class left join student on class.id = student.classId;
在student表建立索引,class表可以利用索引去驱动student表
(实际测试情况会有出路,是因为class里面是主键id,explain分析的type会是eq_ref)
当然,如果索引由于不可抗力建在了class表上,需要灵活变通,使用没有索引的基准表驱动有索引的表
left join 或者 right join 灵活使用
(2)小表驱动大表最多使用情况是对 in 和 exists 优化
仍然是需要建立索引
具体原理简单理解
后期再深入理解
(3)关于order by的优化
order by的排序在老版本是双路排序,两次IO操作,新版本单路排序,一次IO(描述的十分浅显,可百度一下)但是,当取出的数据无法通过单路排序一次性取出时,会造成多次IO操作,性能不如双路排序,此时需要调整mysql数据库的sort_buffer_size 和 max_length_for_sort_data 参数调优
禁止select *
禁止order by age asc, id desc 这种排序出现,此时不会使用到索引(即使是覆合索引的两个字段)
group by 先分组再排序
(4)varchar类型使用时不打单引号建议等公司主动辞退你,还可以捞补偿金,不打单引号会使索引失效,同时行级锁变成表级锁
(5)行级锁的本质还是索引,只不过锁的索引的索引值!
(6)间隙锁。。。