插入数据

  • 批量插入数据推荐使用下面语句
INSERT INTO 表名(字段1,字段2,......) VALUES (值1,值2,......),(值1,值2,......),(值1,值2,......);
  • 如果数据量过于庞大,数据条数大于1000推荐使用文件导入的方式进行插入,方法如下
## 登录mysql的时候需要添加--local-infile参数
mysql --local-infile -u root -p
## 登录之后设置local_infile为1,开启从本地加载文件导入数据的开关
set global local_infile=1;
## 使用load命令导入数据
load data local infile '文件' into table `表名` fields terminated by `文件里面的分隔符` lines terminated by '\n';

文件里面的内容格式如下

1,a,b,c
2,b,c,d

PS:主键顺序插入性能高于乱序插入

主键优化

  • 数据组织方式

在InnoDB存储引擎中,表数据都是根据逐渐顺序组织存放的,这种存储方式的表成为索引组织表(index organized table IOT)

  • 页分裂

页可以为空 ,也可以填充一半,也可以填充100%。每个页包含了2-N行数据(如果 一行数据多大,会溢出),根据主键排列。

  • 页合并

当删除一条记录时,实际上记录并没有被物理删除,只是被标记(flaged)为啥暗处并且他的空间变得允许被其他记录声明使用。当页面中删除的记录达到MERGE_THRESHOLD(默认为页的50%),InnoDB会开始寻找最靠近的页(前或后)看看是否可以将两个页合并已优化空间使用。

  • 主键设置原则
  1. 满足业务要求的情况下,尽量降低主键长度。
  2. 插入数据的时,尽量选择顺序插入,选择使用AUTO_INCREMENT自增主键。
  3. 尽量不要使用UUID做主键或者是其他自然主键,如身份证。
  4. 业务操作时,避免对主键的修改。

order by优化

  • Using filesort

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

  • Using index

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

  • 优化
  1. 根据排序字段建立合适的索引,多字段排序时,也遵循最左前缀法则。
  2. 尽量使用覆盖索引。
  3. 多字段排序,一个升序一个降序,此时需要注意联合索引在创建时的规则(ASC/DESC)
  4. 如果不可避免出现filesort,大数据量排序时,可以适当增大排序缓冲区大小sort_buffer_size(默认256k)。

group by优化

  • 分组操作时,可以通过索引来提高效率。
  • 分组操作时,索引的使用也是满足最左前缀法则的。

limit优化

一般分页查询时,通过创建 覆盖索引 能够比较好的提高性能,可以通过覆盖索引加子查询形式进行优化。

count优化

  • 在MyISAM引擎把一个表的总行数存在了磁盘上,因此执行count(*)的时候会直接返回这个数,效率很高。
  • InnoDB引擎就麻烦了,他执行count(*)的时候,需要把数据一行一行的从引擎里面读出来,让后累计计数。
  • count(主键)

InnoDB引擎会遍历整张表,把每一行的主键id值都取出来,返回给服务层。服务层拿到主键后,直接按行累加(主键不可能为null)。

  • count(字段)

没有not null约束时: InnoDB疫情会便利整张表把每一行的字段值都取出来,返回给服务层,服务层判断是否为null,不为null,计数累加。

有not null约束时: InnoDB疫情会便利整张表把每一行的字段值都取出来,返回给服务层们直接按行进行累加。

  • count(1)

InnoDB疫情遍历整张表,但不取值。服务层对于返回的每一行,放一个数字“1”进去,直接按行累加。

  • count(*)

InnoDB疫情并不会把全部字段取出来,而是专门做了优化,不取值,服务层直接按行进行累加。

  • 优化方案

    1. 可以自己做count,使用缓存数据库做这类工作。
    2. 按照效率排序的话,count(字段)<count(主键)<count(1)≈count(*),所以尽量使用count(*)。

update优化

InnoDB的行锁是针对索引加的锁,不是针对记录家的锁,并且该索引不能失效,否则会从行锁升级为表锁。规避这种情况就需要在对应字段创建索引。

最后修改:2023 年 09 月 05 日
如果觉得我的文章对你有用,请随意赞赏