Mysql的Sql优化方案

1.limit优化

分页查询的本质是使用limit关键字,但是一般查询的都是所有数据,即 select * 这样的形式,但是这样大多会导致回表查询,查询效率太低。 

优化方案一般是覆盖索引加子查询来实现 :

例如:select  * from  stu t ,(select id from  stu order by id limit 200000 ,10)a where t.id=a.id;

核心思想就是利用覆盖索引来替换回表查询,主表再进行嵌套子查询得到所有数据。

2.insert优化

  • 批量插入,减少对数据库的操作次数
  • 手动开启事务,防止每操作一次insert就开启一次事务,降低事务开启的频率,
  • 主键顺序插入,
  • 大批量插入数据(一次几百万)使用load指令

3.主键插入优化

  • 主键乱序插入会导致页分裂,尽量是主键顺序插入。innodb存储结构的最小单位是页,一页的大小就是16k ,一个段空间是1m,乱序插入会导致页分裂,页的指针重新排序。
  • 尽量降低主键的长度
  • 插入数据尽量顺序插入
  • 尽量不要使用uuid做主键或者其他自然数,因为是无序的
  • 尽量减少主键修改

4.order by优化

排序分为两种:

一种是通过索引或者全表扫描满足条件的行,在排序缓冲区内进行排序

另一种是通过有序索引直接返回已经排序好的数据

  • 优化方案:
  • 尽量使用覆盖索引
  • 为排序字段建立合适索引,
  • 加大排序缓冲区的大小

5.group by优化

为字段建立索引提升效率

分组操作时,索引的使用也是满足最左前缀法则。

6.count 优化

count优化就看他是否会对字段取值以及做非空判断,count函数得到的结果在服务层做计数累加。

count函数使用一般分为几种情况:

  • count(主键):遍历整张表,取出每行的主键id,在服务层累加
  • count(字段):会判断字段有没有非空约束,有非空约束,取出字段判断是否非空,然后在服务层累加、。没有非空判断,取值按行累加。
  • count(1):innodb遍历整张表,但不取值,服务层对于返回的行数据,放入“1”进去,直接按行累加。
  • count(*):不会把所有值取出来,不取值直接累加。

效率排序:* >1>主键id>字段

7.update 优化

注意根据索引字段进行跟新,否则行锁会升级为表锁。且索引不能失效, 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值