Sql优化

1.insert优化

        比如我们现在要插入1000000条数据,我们之前采取的措施是一条条insert语句插入,但是这样效率太低了,需要频繁的连接数据库,所以初步的改进措施批量插入并且手动提交事务

Sql优化_第1张图片

        但就算是批量插入,效率还是比较低,对于大批量插入数据,此时我们就可以使用mysql提供的load指令来进行插入。具体的操作如下:

MySQL和Oracle怎么导入千万级大量数据 - 掘金

2.主键优化

        如果插入数据时主键是按顺序插入、效率会比乱序插入的效率高。

2.1页分裂问题

        为了保证聚簇索引叶子结点是双向连接并且有序的,主键乱序插入可能会导致页分裂。

2.2页合并问题

        当我们删除一行记录时,实际上记录并没有被物理删除,只是记录被标记为删除并且它的空间变得允许被其他记录声明使用。

Sql优化_第2张图片

        当页中删除的记录达到一定的阈值时(默认50%),Innodb会开始寻找前后页看看是否可以将两个页合并以优化空间使用。  

Sql优化_第3张图片

2.3主键设计原则

  • 尽量要降低主键的长度。

  • 插入数据时,尽量选择顺序插入,可以选择主键自增。

  • 尽量不要使用UUID或者其他乱序的数做主键。

  • 尽量不要修改主键。

3.order by优化

3.1Using FileSort和Using index

我们执行几条排序的sql,通过explain执行计划我们发现在extra中有Using filesort和Using index两种。

  • Using filesort:通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区sort buffer(默认256k)中完成排序的操作,所有不是通过索引直接返回排序结果的排序都叫File sort排序。

  • Using index:通过有序索引顺序扫描可直接返回有序数据,这种情况即为Using index,不需要额外的排序,操作效率高。

3.1排序优化

  • 根据排序字段建立合适的索引,也要遵守最左前缀原则。

  • 尽量使用覆盖索引,可以建立联合索引。

  • 如果避免不了filesort,可以适当的增大排序缓冲区的大小。

4.group by优化

  • 在分组操作时,可以通过索引来提高效率。

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

5.limit优化

        当我们想要查询2000000为起始位置后的10行包含所有字段的数据时,传统简单的limit语句耗时很大。

        我们可以通过覆盖索引+子查询来优化性能,先把需要的id查询出来,然后再进行一个表的关联即可。如下:

 6.count优化

几种count的比较:

  • count(*):Innodb引擎遍历整张表但并不会把全部的字段取出来,专门做了优化,在服务层直接按行累加即可。

  • count(1):Innodb引擎遍历整张表但不会取值,在服务层的每一行中放数字1,直接按行累加。

  • count(主键):Innodb引擎遍历整张表会把每一行的主键id取出来,返回给服务层按行进行累加。

  • count(其他字段):如果该字段设置允许为null值,Innodb引擎遍历整张表会把此字段的值取出来,返回给服务层会判断,如果为null,则不加,如果不为null,则进行累加。

7.update优化

        在InnoDB的引擎下,按照默认的隔离级别,事务开启后,如果以id作为条件修改某行数据时会给该行数据加上行锁,直到事务结束。

        但是!!!作为条件的字段如果没有索引的话,行锁会自动升级为表锁!!!

所以我们需要注意:

 

 

                

你可能感兴趣的:(mysql,sql,数据库)