mysql优化的几个常见问题总结
在项目中,总会遇到一堆sql慢的要死的问题,我在项目中遇到的一些问题和请教了一些老师傅,总结一下,做个备忘录
一、首先要了解sql语句的执行过程
比如,select * from user where name = 'laoli'
执行的顺序肯定是从from开始的
查询字段从表中,条件是,name=‘laoli’;
我们看下select * from A a left join B b on a.id = b.id where a.name = 'laoli'
同理,如果A有10条数据,B有5条数据,展示的条数应该是10条,执行的顺序是
从from开始,查询A表 left join B on下 从笛卡尔积中找到A的id 等于B的id,然后在找下where条件
二,学会做减法
举个例子
在多表查询中,有些大表的数据特别多,我们不可能对这个大表进行全扫描;
我们要在大表中,根据我们的需求,先去在大表中查询到我们想要的数据,
如果C是个大表,我们就先在C中做减法;
select * from A a join B b on a.id = b.id jion (select id,name from c where c.createtime between time1 and time 2) on a.id = c.id where 条件
三,建立索引
1,尽量保持建立索引的那个字段的散列性,重复率不要超过10%;极端的例子,你给性别做索引,没有什么意义,只有三个,男,女,其他;
2,经常出现在where条件上的字段,要建立索引;
3,频繁增删改的字段,尽量不要建立索引,容易产生碎片;
4,无效的索引一定要及时删除;
5,字段NULL值比较多的,尽量必要建立索引;在建表初期,将null尽量赋值为别的字符;
6,在join 的on 后面需要的字段,根据实际情况,建立索引;
7,表的主键和外键,必须是索引;
8,not like %,like %开头,in not null这些,索引无效
9,学会组合索引,ABC,三个索引,A要当排头;
等等等,欢迎大家来补充,谢谢。
四,学会分区,分表,分库
分区分表分库要明白,数据的散列性分布,尽量不要造成数据倾斜;
五,sql的优化
1,select * from user where age/2=10 和select * from user where age=20;这两个sql,第二条的执行效率明显高于第一条;
第一条,需要age这个字段进行全表扫描,但是第二条不会;所以,我们不要对字段进行计算;
2,合理的使用索引;
3,JOIN字段都根据业务需求提前加上索引
4,尽量不要select * ;
5,>和<号等运算符的运用,避免全表扫描
6,将大量的OR,用成in;
select num from a where num =1 or num =2 or num = 3 ===》select num from a where num in(1,2,3)
7,like %字段%会导致索引失效,不如改成like 字段%
8,在已知的区间中,尽量使用between;
等等,优化的语句还有很多,在项目过程中,慢慢补充