仅供自己学习
结论写在前面:
1、尽量避免进行全表扫描,可以给where和order by涉及的列上建立索引
2、尽量在where子句中使用 !=或<>操作符,因为这样会导致引擎放弃索引而进行全表扫描
3、尽量避免在where子句中对字段进行null的判断(如:select id from t where age is null )
4、尽量避免在where子句中使用or来连接条件,否则将会导致引擎放弃索引而进行全表扫描(如:select id from t where num=10 or num=20 ,可以union all:select id from t where num=10 union all select id from t where num=20 )
5、尽量避免在like查询中使用2个%来查询,否则进行全表扫描(如:select id from t where name like '%abc%' )
6、尽量避免在where子句中使用in和not in来查询,否则进行全表扫描(如:select id from t where num in(1,2,3) ,可以使用between:select id from t where num between 1 and 3 )
7、尽量避免在 where 子句中对字段进行表达式操作,否则进行全表扫描(如:select id from t where num/2=100 ,可以:select id from t where num=100*2 )
8、尽量避免在where子句中对字段进行函数操作,否则进行全表扫描
9、在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
10、很多时候用 exists 代替 in 是一个好的选择(如: select num from a where num in(select num from b) ,可以替换:select num from a where exists(select 1 from b where num=a.num) )
11、任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。