当前位置:网站首页>MySQL使用什么作为主键比较好
MySQL使用什么作为主键比较好
2022-06-21 06:30:00 【youzhouliu】
在设计关系型表结构时,设计主键是一个必不可少的步骤。
实际应用中,经常会看到一些表使用连续自增 id 作为主键,一些表使用 uuid 作为主键,也有使用雪花 id 作主键的。
对于在 mysql 中设计表的时候,mysql 官方推荐不要使用 uuid 或者不连续不重复的雪花 id (long形且唯一,单机递增),而是推荐连续自增的主键 id,官方的推荐是 auto_increment,那么为什么不建议采用 uuid,使用 uuid 有什么坏处?
首先进行一个数据量的比较:
向 mysql 插入 100万 条数据,使用 uuid 作为主键时的效率非常低,使用 雪花id 的效率次之,使用 自增id 的效率最好。使用 uuid 的方式时,在数据量较大的情况下,效率会直线下滑。
使用 uuid 和 自增id 的索引结构对比
1、自增id 的内部结构
自增的主键的值是顺序的,所以 Innodb 把每一条记录都存储在一条记录的后面。当达到页面的最大填充因子时候(innodb 默认的最大填充因子是页大小的15/16,会留出1/16的空间留作以后的修改):
a、下一条记录就会写入新的页中,一旦数据按照这种顺序的方式加载,主键页就会近乎于顺序的记录填满,提升了页面的最大填充率,不会有页的浪费;
b、新插入的行一定会在原有的最大数据行下一行,mysql 定位和寻址很快,不会为计算新行的位置而做出额外的消耗;
c、减少了页分裂和碎片的产生。
2、uuid 的内部结构
因为 uuid 相对顺序的自增id来说是毫无规律可言的,新行的值不一定要比之前的主键的值要大,所以 innodb 无法做到总是把新行插入到索引的最后,而是需要为新行寻找新的合适的位置从而来分配新的空间。
这个过程需要做很多额外的操作,数据的毫无顺序会导致数据分布散乱,将会导致以下的问题:
a、写入的目标页很可能已经刷新到磁盘上并且从缓存上移除,或者还没有被加载到缓存中,innodb 在插入之前不得不先找到并从磁盘读取目标页到内存中,这将导致大量的随机IO;
b、因为写入是乱序的,innodb 不得不频繁的做页分裂操作,以便为新的行分配空间,页分裂导致移动大量的数据,一次插入最少需要修改三个页以上;
c、由于频繁的页分裂,页会变得稀疏并被不规则的填充,最终会导致数据会有碎片。
在把随机值(uuid 和 雪花id)载入到聚簇索引(innodb 默认的索引类型)以后,有时候会需要做一次 OPTIMEIZE TABLE 来重建表并优化页的填充,这将又需要一定的时间消耗。
使用 自增id 的缺点:
a、当有爬虫爬取数据库时,就可以根据数据库的自增id获取到业务增长信息,很容易分析出你的经营情况;
b、对于高并发的负载,innodb 在按主键进行插入的时候会造成明显的锁争用,主键的上界会成为争抢的热点,因为所有的插入都发生在这里,并发插入会导致间隙锁竞争;
c、Auto_Increment 锁机制会造成自增锁的抢夺,有一定的性能损失。
边栏推荐
- 回答问题:你认为AGI应该采用什么思路?
- Functions and methods in Scala
- Record the problem that Navicat connection PostgreSQL cannot display the corresponding table
- 认知语言学之框架与脚本
- 【查询数据表中第三行数据】
- Issue 6: which mainstream programming language should college students choose
- Course design of simulated bank deposit and withdrawal management system in C language (pure C language version)
- [[graduation season · advanced technology Er] - experience shared by senior students
- 第13期:Flink零基础学习路线
- leetcode 410. Maximum value of split array - (Day30)
猜你喜欢
随机推荐
数据库有用户更改密码问题
FPGA - 7 Series FPGA selectio -01- introduction and DCI technology introduction
Issue 13: Flink zero foundation learning route
Xshell7 connects to the server remotely and suspends the process to keep the program running
C语言实现模拟银行存取款管理系统课程设计(纯C语言版)
Pycharm的快捷键Button 4 Click是什么?
827. maximum man-made island and collection search
查询数据表中第N行数据。更新表第N行数据
Functions and methods in Scala
C语言程序设计——三子棋(学期小作业)
leetcode 410. Maximum value of split array - (Day30)
Introduction to 3D engine software wizard
创新项目实训:数据爬取
Backtracking method of graph coloring problem (the most easy to understand)
Course design of simulated bank deposit and withdrawal management system in C language (pure C language version)
Issue 6: which mainstream programming language should college students choose
Butler-Volmer 公式的由来
双列集合(Map集合)
Modbus Poll v9.9.2 Build 1690 Modbus测试工具单文件版
[graduation season] a brief talk on the learning experience before sophomore year


![Small program [phase I]](/img/2d/1319e630f133e85dd8dd191a78a87d.png)






![[data mining] final review Chapter 3](/img/9a/68c3ce12b0f55e9b26b6f054e2ffe7.png)