仅供自己学习
结论写在前面:
1、尽量避免进行全表扫描,可以给where和order by涉及的列上建立索引
3、尽量避免在where子句中对字段进行null的判断(如:select id from t where age is null )
5、尽量避免在like查询中使用2个%来查询,否则进行全表扫描(如:select id from t where name like '%abc%' )
7、尽量避免在 where 子句中对字段进行表达式操作,否则进行全表扫描(如:select id from t where num/2=100 ,可以:select id from t where num=100*2 )
8、尽量避免在where子句中对字段进行函数操作,否则进行全表扫描
9、在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
11、任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。
12、在数据量大的时候,应尽量避免复杂的子查询,使用left join来代替
13、在使用join连表查询的时候,被用来join的字段应该是同样的数据类型,对于字符串列,还要相同的字符集,否则将放弃使用索引
14、join连表时,用小结果集驱动大结果集,尽量减少join语句中的Nested Loop的循环总次数
15、join连表时,优先优化Nested Loop的内层循环,因为内层循环是循环中执行次数最多的,每次循环提升很小的性能都能在整个循环中提升很大的性能
16、对被驱动表的join字段上建立索引
17、当被驱动表的join字段上无法建立索引的时候,设置足够的Join Buffer Size