1、如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择主键作为聚集索引。

如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯一索引作为主键索引。

如果也没有这样的唯一索引,则InnoDB会选择内置6字节长的ROWID作为隐含的聚集索引(ROWID随着行记录的写入而主键递增,这个ROWID不像ORACLE的ROWID那样可引用,是隐含的)。

2、数据记录本身被存于主索引(一颗B+Tree)的叶子节点上,这就要求同一个叶子节点内(大小为一个内存页或磁盘页16K)的各条数据记录按主键顺序存放

因此每当有一条新的记录插入时,MySQL会根据其主键将其插入适当的节点和位置,如果页面达到装载因子(InnoDB默认为15/16),则开辟一个新的页(节点)

3、如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页

4、如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置

此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉(上一次和这一次插入的页不是一个页,大量的磁盘随机 IO),此时又要从磁盘上读回来,这增加了很多开销

同时频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE来重建表并优化填充页面。

MySQL面试:为什么用自增列作为主键相关推荐

  1. 为什么一般用自增列作为主键?

    为什么一般用自增列作为主键? 为什么一般用自增列作为主键? 如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页 如果使用非自增主键( ...

  2. mysql复合主键长度_Mysql 多列形成主键(复合主键 )

    什么是数据表的复合主键 所谓的复合主键 就是指你表的主键含有一个以上的字段组成 比如 create table test ( name varchar(19), id number, value va ...

  3. ms sql 带自增列 带外键约束 数据导入导出

    1,生成建表脚本 选中要导的表,点右键-编写表脚本为-create到  ,生成建表脚本 2,建表(在新库),但不建外键关系 不要选中生成外键的那部分代码,只选择建表的代码 3,导数据,用SQL STU ...

  4. mysql删除表里所有自增行,主键重新开始递增的方法

    ALTER TABLE customer_inf  AUTO_INCREMENT =0;

  5. mysql 自增列 类型_MySQL--自增列学习

    ##=====================================================================================## 在数据库表设计中会纠 ...

  6. MySQL--自增列学习

    ##=====================================================================================## 在数据库表设计中会纠 ...

  7. MySQL 使用自增ID主键和UUID 作为主键的优劣比較具体过程(从百万到千万表记录測试)...

    測试缘由 一个开发同事做了一个框架.里面主键是uuid.我跟他建议说mysql不要用uuid用自增主键,自增主键效率高,他说不一定高,我说innodb的索引特性导致了自增id做主键是效率最好的,为了拿 ...

  8. MySQL 使用自增ID主键和UUID 作为主键的优劣比较详细过程(从百万到千万表记录测试)...

    Reference: https://blog.csdn.net/mchdba/article/details/52336203 一个开发同事做了一个框架,里面主键是uuid,我跟他建议说mysql不 ...

  9. mysql读取自增值失败_MySQL添加自增列失败

    想往一个mysql表里添加一个自增列做主键,居然失败报告无法读取,这是怎么回事? 1.问题描述 有位朋友在升级discuz论坛数据库时遇到问题了,想给一个表添加自增列做主键,结果发生下面的报错: my ...

最新文章

  1. crm开源系统 tp框架_thinkphp6学习教程与源码 tp6开源CMS系统源码研究
  2. MySQL数据库中默认事务隔离级别是?
  3. GATB的使用小例子test.cpp
  4. 独家 | 使用TensorFlow 2创建自定义损失函数
  5. 【 MATLAB 】Fourier Transforms ( fft )
  6. linux c 内存泄露 检查工具
  7. java IO之 File类+字节流 (输入输出 缓冲流 异常处理)
  8. 数字图像处理:附录-程序实例、参考文献、标准图片集合
  9. sql语句的学习(2)
  10. mysql增量备份具体步骤_记一次mysql全量备份、增量备份的学习过程
  11. Web Service视频分享
  12. c++多线程在异常环境下的等待
  13. Android 编程下 ListView 和 CheckBox 混合使用时的常见问题
  14. 几个特别棒的免费可商用字体
  15. php中的fpm_基于php-fpm的配置详解
  16. creo三维生成二维图_proe5.0三维图转二维图
  17. Recovering Realistic Texture in Image Super-resolution by Deep Spatial Feature Transform
  18. H.264 AVCC header
  19. TCP/IP可能有你不知道的事
  20. 【NLP】第8章 将 Transformer 应用于法律和财务文件以进行 AI 文本摘要

热门文章

  1. 长春哪个学校可以学习计算机编程的,长春编程学习,长春学编程的学校,长春学编程自学好还是报班好 - IT教育频道...
  2. 4个基本不等式的公式高中_不等式链(高中4个基本不等式链推导)
  3. ChatGPT 拓展资料:Telegram Bot 打造专属聊天机器人
  4. CRS-4544: Unable to connect to OHAS has启动失败
  5. oracle查找当前日期的三个工作日前那天日期,采用函数方式
  6. 全球工业半导体市场占有率十大排名出炉
  7. 新启动计算机顺序,最新版本:计算机启动启动项设置
  8. js判断数据是否为空值的方法
  9. Android Studio Win7安装
  10. 2.1、用JsonParser解析json树模型