1、重要的或数据量大的表sql必须走索引,比如update、delete语句的where条件列,order by、group by、distinct的相关字段,多表join的字段
2、不要使用select *,减少回表,最好直接使用索引里内容进行返回,因为回表时,还会再去查一次
3、不在null上加索引,最好在设计时,就加上默认值,因为null会额外占用存储空间,并且复合索引会无效
4、避免冗余索引,因为联合索引是最左前缀匹配原则,也就是说若有索引(col1,col2,col3),其实他就已经包含了索引(col1)和索引(col1,col2),但并不包含索引(col2,col3)
5、范围查询时,范围列可以用到索引(必须是最左前缀),但范围列后面的列匹配不到索引,同时,索引最多用于一个范围列,若查询条件中有两个范围列,只有一个范围列能走索引。即where a = 1 and b = 2 and c > 3 and d = 4,若建立的是索引(a,b,c,d),则只有abc能匹配到索引,d是匹配不到的;如果是建立的是索引(a,b,d,c)则是可以匹配上
6、=和in是可以乱序排列,mysql的查询优化器可以优化成索引识别的形式
7、尽量少使用or,因为即使一边有带条件的索引也是不会使用的,要想使用or并走索引,就得把or条件中的所有列都加上索引,即where username ='zhangsan' or age=18,只有age和username两个都有索引时,才会走索引
8、在sql上进行条件计算(函数计算或数学运算),不走索引,比如where length(username)now()、或者id/10=1,都是走不了索引
9、不使用负向查询,例如 not in,!= ,not like,<> ,is not null等,这些也走不了索引
下一步我会继续探究分享,MySQL的查询优化器具体实现,以及他选择索引的依据是什么?