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;

     等等,优化的语句还有很多,在项目过程中,慢慢补充

            

               

原文地址:https://www.cnblogs.com/invban/p/14605657.html