一、选择合理的字段类型
1.固定长度用char,变长采用varchar
2.能用数字类型就不用字符串
二、select查询时需要什么数据就查哪些字段,尽量不使用select *
1.需要哪些数据就查数据,否则会增加网络IO传输耗时。
2.select *不会走覆盖索引,会出现大量的回表查询,而从导致查询sql的性能很低。
三、进行where比较时,尽量用索引进行比较,否则会全表扫描
四、当使用union和union all的情形,如果查询结果不需要去重,尽量使用union all,减少排除重复数据的耗时
五、合理使用in或者exist减少查询范围
1. in 适用于左边大表,右边小表。因为如果sql语句中包含了in关键字,则它会优先执行in里面的子查询语句。
2. exists 适用于左边小表,右边大表。如果sql语句中包含了exists关键字,它优先执行exists左边的语句。
六、插入多条数据时,避免一条条数据插入,而是使用批量语法。
七、多用连接查询代替子查询
1.mysql中如果需要关联多张表查询时,尽量少使用嵌套查询,因为这样会产生临时表。用join代替
八、group by后面如果还有条件判断,应尽量避免使用having,而是先用where缩小范围再用group by。
九、避免索引失效
1.对索引使用左或者左右模糊匹配(因为索引 B+ 树是按照「索引值」有序排列存储的,只能根据前缀进行比较)
2.对索引使用函数(因为索引保存的是索引字段的原始值,而不是经过函数计算后的值,所以没办法走索引了)
3.对索引隐式类型转换(比如本来时字符串类型,where比较时传的是数字)
4.联合索引非最左匹配
比如,如果创建了一个 (a, b, c) 联合索引,如果查询条件是以下这几种,就可以匹配上联合索引:
where a=1;
where a=1 and b=2 and c=3;
where a=1 and b=2;
5.WHERE 子句中如果在 OR 前的条件列是索引列,而在 OR 后的条件列不是索引列,那么索引会失效。