SQL优化思路

mysql的源码分析,参考之前写的文章 

 https://blog.csdn.net/feivirus/article/details/83716680

 

1.小表驱动大表.
2.能走索引的走索引,性能递减 using index condition,const-> using index,equal/ref->using index,primary->using index,using where->using index,using where,filesort, temporary->all
3.经验值.where条件选出来的数据不到表记录总数的十分之一时,可以用索引。超过时,走全表扫描.
4.每一个left join 的条件都使用索引,EXPLAIN 出来是using index,尽量没有using where.where条件中频繁出现的列用索引.
5.select count时where条件不存在的表在left join中删掉,或者加mybatis的if test= "",尽量不join
6.mysql 优化的驱动表太大时,或者索引选择不是最优时,可以强制用force index
7.尽量去掉 order by,group by,会破坏索引,产生临时表
8.尽量少使用 <>,!=,因为满足条件太多,不走索引.其他的操作符基本都走索引.能用>=,不用>.
9.有索引不一定走,和记录数据的分布,区分性有关.
10.尽量避免使用or,不走索引,可以使用union all代替.比如
explain SELECT * FROM `xxx` where order_no ="xxx" or order_no='xxx';
explain SELECT * FROM `xxx` where order_no ="xxx" UNION all SELECT * FROM `xxx` where order_no ="xxx"  ;
前者是用range,后者是用ref.union和or的区别是使用使用索引.
11.能用between,不用in.前者是用range索引,后者是range,有待源码分析.
12.注意like的最左前缀,索引有没有生效.复合索引的第一列一定要在where条件中,比如a,b,c,where 中是a=xxx and c=xxx,因为索引下推,a和c都生效.
13.尽量使用索引下推进行查询或者left join.
14.EXISTS 代替in,有待源码分析.
15.用varchar代替char,减少存储开销.存储少,索引树中每个节点存储的记录更多.
16.能select id的不用select *,减少io,可能用到索引直接返回,不回表.
17.使用临时表存中间结果.可以减少对更新锁的阻塞.可以使用nolock减少锁的使用.查询锁会阻塞更新锁.
18.能用批处理更新的,不要用一条条记录更新.
19.mysql的limit 1000,10.会查询出1000条记录,再拿出最后10条,尽量减少分页太靠后.
20.经常使用explain extended看下执行计划,使用select * from information_schema.optimizer_trace;查看优化步骤.
21.where 中对列使用表达式或者聚集函数,有可能会使索引失效,尽量避免.比如
SELECT * from `xxx`  where substr(name, 1, 3)='abc';
SELECT * FROM `xxx` where name like 'abc%'; 前者索引失效,后者索引正常.
22.where 中使用 is null可能使索引失效,null可以使用索引,原因是数据分布,满足数据的太多,不如全表扫描快.
23.使用数字代替字符,数字只需比较一次,字符需要多次比较.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值