- 尽量避免全表扫描,考虑在where及order by 涉及的列上建立索引;
- 最好不要给数据库留null,尽可能使用not null约束填充数据库,避免在where子句中对字段进行null判断,否则将导致引擎放弃使用索引而进行全表扫描;如:
select * from user where name is null;
- 应该尽量避免在where子句中使用!=或<>操作符,否则将导致引擎放弃使用索引而进行全表扫描;
-
应该尽量避免在where子句中使用or来连接条件,如果or的两个字段,一个有索引,一个没有索引,将导致引擎放弃使用索引而进行全表扫描;如:
select id from user where age = 10 or address = '成都'; -- 可优化为: -- select id from user where age = 10 union all select id from user where address = '成都';
- 慎用in 和 not in,否则会进行全表扫描;in和exists的区别单独说明;
- 避免使用:like '%abc%',否则会进行全表扫描;如:
select name from user where name like '%chisaki%';
- 尽量避免在where子句中对字段进行表达式操作,否则将导致引擎放弃使用索引而进行全表扫描;如:
select name from user where age/2 = 10; -- 应改为:-- select name from user where age = 10 * 2;
- 尽量避免在where子句中对字段进行函数操作,否则将导致引擎放弃使用索引而进行全表扫描;如:
select name from user where substring(name,1,3) = 'abc'; -- 应改为: -- select name from user where name like 'abc%';
- 避免在where子句中的 “=” 左边进行函数、算术运算或者其他表达式运算,否则系统将可能无法正确使用索引;
- 在使用索引字段作为条件时,如果该索引时符合索引,那么必须使用到该索引的第一个字段作为条件时才能保证系统使用该索引,否则索引不会使用,并且尽可能的让字段顺序与索引顺序一致;
- 对于多张大数据量的表join,要先分页在join,否则逻辑读会很高,性能很差;
- 索引并不是越多越好,索引能提高select的效率,但是降低了insert及update的效率,一个表的索引最好不要超过6个;
- 避免使用select * ,用具体的字段代替*,不要返回不使用的字段。
转载自:https://www.cnblogs.com/yunfeifei/p/3850440.html