MySQL进阶篇之SQL优化

Posted nuist__NJUPT

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL进阶篇之SQL优化相关的知识,希望对你有一定的参考价值。

我们看一下SQL的优化,主要从7个方面学习SQL优化,分别为插入数据,主键优化,order by优化,group by优化,limit优化,count优化,update优化等,一起来快速学习一下吧。

目录

1.插入数据优化

2.主键优化

3.order by 优化

 4.group by优化

5.limit分页查询优化

6.count优化

 7.update优化

 8.小结


1.插入数据优化

首先就是插入要尽量批量插入,不要一条一条插入,尽量手动提交事务,主键顺序插入的性能要高于乱序。

 如果是一次性进行大批量数据的插入,使用load指令比insert指令要性能要好很多,具体如下:

 

2.主键优化

主键的设计原则主要包含四个部分:主键长度长,导致二级索引多,将会占用大量的磁盘空间,搜索的时候将会耗费大量的磁盘I/O。主键顺序插入效率高,乱序插入可能导致页分裂,导致性能变差。不要修改主键,还要动索引结构,很麻烦。

 

3.order by 优化

我们进行排序时,尽量保证走有序索引扫描,然后直接返回有序数据,不需要额外排序,这种效率更高,我们如果创建age和phone字段的联合索引,使用单个字段进行排序,或者同时使用两个字段进行升序或者降序排序,均会走索引。

如果用的是复合索引,一旦出现一个升序,一个降序排序,就会出现filesort。尽量使用覆盖索引,只在二级索引进行查询即可,不需要回表查询,提升性能,多字段排序,也要遵循最左前缀原则,如果要在缓冲区 排序,可以适当地增加缓冲区大小。

 4.group by优化

在进行分组操作的时候也可以使用索引进行优化,索引的使用也满足最左前缀法则。

5.limit分页查询优化

  通过覆盖索引加上子查询的方式对limit分页查询进行优化,具体如下:

6.count优化

使用count进行计算总记录数的时候,尽量使用count(*),INNODB不会把字段取出来,而是直接在服务层进行累加。count(主键)需要将id取出来,返回给服务层,count(字段)也会取出来,对于没有约束的字段还需要进行非空判断。count(数字)就是放进去数字,然后累加。

 7.update优化

InnoDB的行锁是针对索引加的锁,不是针对记录,执行更新的条件应该有索引,否则行锁会升级为表锁,并且索引不能失效,否则行锁也会升级为表锁,并发性能降低。

 8.小结

其实SQL优化的本质就是就索引进行优化 ,插入数据的优化就是批量插入,主键顺序插入,防止乱序插入可能导致页分裂,大批量导入也可以使用load,主键优化的主键尽量短,降低二级索引的存储压力。排序的话尽量走using index,直接索引返回,性能高。分组操作的字段也可以使用索引优化,分页查询使用覆盖索引+子查询,cunt的话尽量使用count(*),update也可以根据索引字段进行更新,性能更高。

以上是关于MySQL进阶篇之SQL优化的主要内容,如果未能解决你的问题,请参考以下文章

mysql 开发进阶篇系列 5 SQL 优化

MySQL进阶之SQL优化

第31天MYSQL进阶-写优化- 插入优化(SQL 小虚竹)

超详细图解!MySQL进阶篇SQL优化-索引-存储引擎

MySQL进阶篇之视图/存储过程/触发器

MySQL数据库进阶版 --MySQL项目优化