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)间隙锁。。。

原文地址:https://www.cnblogs.com/aoligei/p/15107842.html