数据库性能优化之sql优化查询

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,即不是按照最左前缀法则。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值