当前位置:网站首页>数据库主键一定要自增吗?有哪些场景不建议自增?
数据库主键一定要自增吗?有哪些场景不建议自增?
2022-06-21 17:34:00 【InfoQ】
CREATE TABLE `user` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` char(10) NOT NULL DEFAULT '' COMMENT '名字',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
AUTO_INCREMENT主键不自增行不行
AUTO_INCREMENTCREATE TABLE `user` (
`id` int NOT NULL COMMENT '主键',
`name` char(10) NOT NULL DEFAULT '' COMMENT '名字',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `user` (`name`) VALUES ('debug');
Field 'id' doesn't have a default valueINSERT INTO `user` (`id`,`name`) VALUES (10, 'debug');
为什么要用自增主键


PRIMARY KEY (id)- 数据页大小是固定 16k
- 数据页内,以及数据页之间,数据主键 id 都是从小到大排序的


没有主键可以吗
CREATE TABLE `user` (
`name` char(10) NOT NULL DEFAULT '' COMMENT '名字'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
ROW_IDtrx_idroll_pointer
有没有建议主键不自增的场景
mysql 分库分表下的 id



69年2的10次方️2的12次方400w
yyMMddHHmmss
100*100=1wtidb 的主键 id 不建议自增
3kwrange 1
用户 id 不建议用自增 id

总结
- 建表 sql 里主键边上的
AUTO_INCREMENT,可以让主键自增,去掉它是可以的,但这就需要你在 insert 的时候自己设置主键的值。
- 建表 sql 里的
PRIMARY KEY 是用来声明主键的,如果去掉,那也能建表成功,但 mysql 内部会给你偷偷建一个 ROW_ID 的隐藏列作为主键。
- 由于 mysql 使用 B + 树索引,叶子节点是从小到大排序的,如果使用自增 id 做主键,这样每次数据都加在 B + 树的最后,比起每次加在 B + 树中间的方式,加在最后可以有效减少页分裂的问题。
- 在分库分表的场景下,我们可以通过 redis 等第三方组件来获得严格自增的主键 id。如果不想依赖 redis,可以参考雪花算法进行魔改,既能保证数据趋势递增,也能很好的满足分库分表的动态扩容。
- 并不是所有数据库都建议使用自增 id 作为主键,比如 tidb 就推荐使用随机 id,这样可以有效避免写热点的问题。而对于一些敏感数据,比如用户 id,订单 id 等,如果使用自增 id 作为主键的话,外部通过抓包,很容易可以知道新进用户量,成单量这些信息,所以需要谨慎考虑是否继续使用自增主键。
链接: https://pan.baidu.com/s/14G-bpVthImHD4eosZUNSFA?pwd=yu27
提取码: yu27开源地址
边栏推荐
- College Physics Chapter 9 vibration
- 第十三周小结
- 删除指定的screen
- JDBC基础知识
- EL表达式
- ACL 2022 | 基于自监督图对齐的多语言知识图谱推理
- Servlet learning (II)
- 2022 China eye Expo, Shandong Youth eye health exhibition, vision correction and rehabilitation Exhibition
- This humble doctor's thesis is very popular: looking back, I feel sorry for countless mountains
- 启动!阿里巴巴编程之夏2022
猜你喜欢

这篇寒门博士论文致谢火了:回首望过去,可怜无数山

Servlet规范(一)

SVG+Canvas粒子动态效果

Must the database primary key be self incremented? What scenarios do not suggest self augmentation?

Notes on writing questions in C language -- find s=a+aa+aaa+aaaa+aa Value of a

GOF mode-03-behavioral mode (bottom)

数据库主键一定要自增吗?有哪些场景不建议自增?

缓存设计问题

WWDC22 多媒体特性汇总

协同过滤(Collaborative Filtering)
随机推荐
文件上传漏洞靶场分析 UPLOAD_LABS
启动!阿里巴巴编程之夏2022
宏基因组 (个人笔记)
Full screen menu animation effect expansion in the upper left corner of SVG
Servlet学习(二)
Canvas动态网状背景js特效
Disclose the design idea of MVVM framework supporting Baidu search, feed and applet, and San core personnel have made great efforts to build it
空中操作仅通过距离映射对遮挡目标进行鲁棒定位(RAL2022)
How to use DBA_ hist_ active_ sess_ History analysis database history performance problems
Does the school of Finance and business belong to a securities company? Is it safe to open an account?
MySQL的MVCC实现原理
Cookies and sessions
华为鸿蒙认证测试题,你能答对几道?
Guys, please ask me a question about flynk SQL. I have an FQL statement, insert into C sale
JDBC基础知识
Does the school belong to a securities company? Is it safe to open an account?
Servlet规范(一)
外资上演“胜利大逃亡”、内资接盘,新东方在线“方”了?
左右两侧垂直带序号的时间轴
Day18Qt信号与槽2021-10-29