MySQL进阶之SQL优化

1. 插入优化

1.1 批量插入

将多条插入语句合并成一条语句批量插入。建议一次批量不超过500~1000

insert into tb_name values(1,'a'),(2,'b),(3,'c');

1.2 手动事务提交

MySQL中默认是自动提交,每执行一条sql就会提交一次事务,效率低。不如直接开启手动提交。

1.3 主键顺序插入

由于MySQL设计原因,顺序插入主键比乱序效率高。

1.4 大批量插入数据

使用load指令将磁盘文件中的数据加入到表结构中。

例如:
MySQL进阶之SQL优化_第1张图片
配置:
MySQL进阶之SQL优化_第2张图片

2. 主键优化

2.1 数据组织方式

在InnoDB中,表数据都是根据主键顺序组织存放的,称为索引组织表简称IOT。

MySQL进阶之SQL优化_第3张图片

因为底层的B+树种维护了一个双向指针,保证有序,在新增数据超过当前页时会进行溢出,如果是有序的,直接开辟一个新的页:
MySQL进阶之SQL优化_第4张图片

如果是乱序主键插入:由于新的元素无法放到当前页中,会将当前页的后50%分裂出去,与新元素重新放到一个新的页中,而后更改指针指向,这种现象称为页分裂。
MySQL进阶之SQL优化_第5张图片
MySQL进阶之SQL优化_第6张图片

  • 页合并:删除一行数据时,并没有真正的执行物理删除,只是被标记删除且空间允许使用,直到当前页的删除记录达到设置的阙值时,会查看附近的页是否可以于其进行合并。

在这里插入图片描述

在这里插入图片描述

2.2 主键设计原则

  1. 在满住需求的前提下,尽量降低主键的长度。
  2. 采用顺序插入,可以使用自增。
  3. 尽量不使用UUID或者其它自然主键。
  4. 尽量避免对主键的修改。

3. order by 优化

通过创建索引或者创建联合索引的方式以到达使用using index的目的。

3.1 using filesort

通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区sort buffer中完成排序操作。

3.2 using index

通过有序索引排序扫描直接返回有序数据,不需要额外排序。

3.3 总结

  1. 根据排序字段创建合适的索引,多字段排序,遵循最左前缀法则;
  2. 尽量使用覆盖索引;
  3. 如果不可避免的出现filesort,可以适量的增加排序缓冲区的大小。

4. group by 优化

可以通过建立适当的索引来提高分组效率,索引使用也满足最左前缀法则。

5. limit 优化

例如要查询limit 1000000, 10,需要对前1000010条记录进行排序,仅仅返回十条记录,丢弃其它的数据,排序消耗效率较高。
可以通过创建覆盖索引和覆盖索引加子查询的形式优化。

6. count 优化

InnoDB需要将数据一行一行的读出,然后累积计数。
优化思路:自己实现计数。

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