1、避免使用select * from tableName,语句中需指定具体字段。
select * 进行查询时,无法使用到覆盖索引,就会造成回表查询。指定具体字段,不仅可以减少表结构变动带来的影响,还可以节省资源、减少CPU和IO以及网络开销。
反例:
select * from user;
正例:
select id,name from user;
2、避免数据类型的隐式转换
限定要查询的数据,避免返回多余的行,需要什么数据,就去查什么数据,避免返回不必要的数据,节省开销,且隐式转换会导致索引失效。
假设建表时 id 为 int 类型,查询 id = 3 的数据
反例:
select id,name from user where id = '3';
正例:
select id,name from user where id = 3;
3、禁止在 where 子句中对字段进行表达式操作或函数转换
若该字段已创建索引,该操作会放弃索引并进行全表扫描。
假设 user 表的 sal 字段,加了索引,对其进行数据查询
反例:
select id,name from user where sal - 1000 = 3000;
正例:
select id,name from user where sal = 40000;
4、优化 like 语句
模糊查询使用 like 时,like很可能让索引失效。
把 % 放前面或者将 % 包裹关键字,均不会走索引查询
无前置 %,只有后置 % 才会走索引查询
反例:
-- % 放前面
select id,name from user where name like '%zhangsan';
-- 使用 % 包裹
select id,name from user where name like '%zhangsan%';
正例:
-- 无前置 %,只有后置 %
select id,name from user where name like 'zhangsan%';
5、使用联合索引时注意索引列的顺序,遵循最左匹配原则
当创建一个联合索引的时候,如(index1,index2,index3),相当于创建了(index1)、(index1,index2)和(index1,index2,index3)三个索引,即最左匹配原则,联合索引不满足最左原则,索引一般会失效。
假设有一个联合索引 (age, sal),age 在前,sal 在后。
反例:
select age, sal from user where sal = 3000;
正例:
-- 符合最左匹配原则
select age, sal from user where age = 25 and sal = 3000;
-- 符合最左匹配原则
select age, sal from user where age = 25;