sql优化查询:
1、复合索引,遵循最左前缀原则。
例如idx_a_b_c(a,b,c)
查询顺序应该按照索引建立时的顺序排,比如a、b、c,a、b,a 索引才有效,(和B+树的数据结构有关)
无效索引举例:
如a、c a有效,c失效,
b、c 两者都无效(就像abc分属桥的头中尾三部,没桥头就没法开始走)
2、不要对索引字段做如下处理
a、以下处理会导致索引失效:
1>计算,如:+、—、*、/、!=、<>、is null、is not null、or
2>函数,如:sum()、round()等等
3>手动或者自动类型转换,如:id="1",本来是数字,给写成了字符串了
3、优化三:索引字段不要放在范围查询右边
例如复合索引:a->b->c ,当where a="" and b>10 and c="",这时候只能用到a和b,c的索引失效,因为在范围之后的索引都失效(和B+树结构有关)
4、减少select * 的使用
原因:select * 使用不到覆盖索引。当然了,实际业务中覆盖索引这种几乎用不到,因为不符合业务需求。但是,我们还是应该要减少一些不必要的字段查询,减少不必要的性能消耗。
使用覆盖索引:就是select 查询字段和where 中使用的字段一致。
5、like模糊查询
失效情况:
like "%张三%"、like "%张三"。
解决方案:
1>使用覆盖索引,即like字段是select字段,select name from table where name like '%张三%';
2>使用'张三%'
6、order by的优化
当查询语句中使用order by进行排序时,如果没有使用索引进行排序,会出现filesort文件内排序,这种情况在数据量大或者并发高的时候,会有性能问题,需要优化。
filesort出现的情况举例:
1>order by 字段不是索引字段;
2>order by字段是索引字段,但是select中没有使用覆盖索引,如:select * from table order by age asc;
3>order by 中同时存在ASC升序和DESC降序,如:select a,b from table order by a ASC,b DESC;
4>order by 多个字段排序时,不是按照索引顺序进行的order by,即不是按照最左前缀法则。