一想到主键优化就不得不提主键一定要顺序插入
首先来了解一下为何这么说,涉及到两个知识点
页分裂
当主键按照顺序插入时,则数据库会一个表一个表地新建,怎么说,大致意思就是:一张表比如说能存8个主键,当按顺序八个主键存满的时候,会开第二个页来存放后续需要存的主键。
可是当你乱序插入时,这个主键为50的值,是不会插入到后面的表中,因为链表需要按顺序进行排序,这个主键为50的数据行,必须插入在47后边。恰好第一页中,已经没有能够存放50的位置,因此第一页中,超出50%的数据将会被切开,并且新建page3,将23,47移至page3中,然后再将50也放进page3,最后,重设置page1、page2和page3的指针,如下图所示:
上述现象就是页分裂,看得出来,确实复杂很多,执行了不少操作步骤,性能肯定是大大降低的,所以,我们需要尽量避免主键乱序插入。
页合并
当删除一行数据的时候,实际上记录中并没有将其物理删除,而是记录被标记(flaged)为删除并且它的空间变得允许被其他记录声明使用。当页中删除的记录达到MERGE_THRESHOLD(默认为页的50%),innoDB会开始顺找最靠近的页(前或者后一页),看看是否可以将两页合并以优化空间使用。(MERGE_THRESHOLD是指页合并的阈值,默认为50%,可以在创建表或者创建索引时指定)
合并前
合并后
主键设计原则
- 满足业务需求的情况下,尽量降低主键的长度
- 插入数据时,尽量选择顺序插入,选择使用AUTO_INCREMENT自增主键
- 尽量不要使用UUID(UUID是无序的,插入的时候就会乱序)做主键或者是其他自然主键,比如说身份证号
- 业务操作时,尽量避免对主键的修改。
本篇文章仅作为学习笔记,供大家复习或者参考,学习源来自于B站黑马程序员下的MySQL数据库教程33. 进阶-SQL优化-主键优化_哔哩哔哩_bilibili