主键是一种唯一索引,InnoDB存储引擎是B+Tree优化后实现的,自增主键是为了维持B+Tree的特性且不用频繁的分裂调整。

在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。

这种索引叫做聚集索引。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。

InnoDB的辅助索引data域存储相应记录主键的值而不是地址。所以不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。

InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效。

1、B-Tree

B-Tree,首先定义一条数据记录为一个二元组[key, data],key为记录的键值,对于不同数据记录,key是互不相同的;data为数据记录除key外的数据。

结构如下:

2、B+Tree

由B-Tree变种而来,区别:内节点不存储data,只存储key;叶子节点不存储指针。由于B+Tree内节点去掉了data域,因此可以拥有更大的出度,拥有更好的性能。

3、InnoDB存储引擎,在经典B+Tree的基础上进行了优化,增加了顺序访问指针。在B+Tree的每个叶子节点增加一个指向相邻叶子节点的指针,就形成了带有顺序访问指针的B+Tree。这样就提高了区间访问性能。

参考:
mysql B+Tree索引 https://www.cnblogs.com/coshaho/p/7203186.html
MySQL索引实现 https://www.cnblogs.com/coshaho/p/7203214.html

MySQL InnoDB存储引擎为什么要用自增的主键?相关推荐

  1. MySQL InnoDB存储引擎

    呵呵哒... MySQL体系结构和存储引擎 首先要搞懂的是什么是数据库,什么是数据库实例. 数据库:物理操作系统文件或其他形式文件类型的集合. 实例:MySQL数据库由后台线程以及一个共享内存区组成, ...

  2. 浅析Mysql InnoDB存储引擎事务原理

    浅析Mysql InnoDB存储引擎事务原理 大神:http://blog.csdn.net/tangkund3218/article/details/47904021

  3. MySQL Innodb存储引擎使用B+树做索引的优点

    对于数据库来说,索引和表数据都是存放在磁盘上的,一般使用B+树作为索引 MySQL Innodb存储引擎使用了B+树作为索引的优点,主要有以下原因: 1.索引和表数据都是存放在磁盘上的,如果磁盘上的数 ...

  4. MySQL InnoDB 存储引擎索引那些事儿

    InnoDB 存储引擎中,表是根据主键顺序组织存放的,称为索引组织表.每个表都有一个主键,如果没有显示定义主键,则会选择第一个创建的非空唯一索引作为主键,如果没有非空唯一索引,InnoDB引擎则自动创 ...

  5. 为什么MySQL InnoDB 存储引擎要用B+树做索引,而不用B树?

    为什么MySQL InnoDB 存储引擎 要用B+树做索引,而不用B树? (1)B+树空间利用率更高,可减少I/O次数 一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存 ...

  6. mysql InnoDB存储引擎的介绍

    mysql InnoDB存储引擎的介绍 概念 1.InnoDB是MySQL默认的存储引擎,如果需要其不支持的特性,则考虑使用其他存储发动机. 2.InnoDB采用MVCC支持高并发,实现四个标准隔离级 ...

  7. 数据结构与索引-- mysql InnoDB存储引擎索引

    索引与算法 索引是我们在应用开发过程中程序数据可开发的一个重要助力.也是一个重要的研究方向,索引太多,应用的性能可能受到影响,如果索引太少,对查询性能又会有制约.我们需要找到一个合适的平衡点,这个对性 ...

  8. MySQL InnoDB 存储引擎文件

    InnoDB 存储引擎文件,为该存储引擎独有,包括表空间文件和重做日志文件. 1.表空间文件 InnoDB存储引擎的数据按照表空间进行存放,默认配置下有一个初始大小和默认名的文件,通过以下命令查看: ...

  9. 谈谈MySQL InnoDB存储引擎事务的ACID特性

    2019独角兽企业重金招聘Python工程师标准>>> 1.前言 狼哥一直对数据库Mysql这块没有进行过系统的深入学习,今天看到一篇文章写的还不错,特意分享一下,我不能保证文章中所 ...

  10. mysql innodb 存储引擎

    --MySQL 结构有两部分组成 1.MySQL server 层 2.存储引擎层 --注:到 存储引擎层之前都属于 MySQL server 层 MySQL 5.1到 5.7 ,大版本 没有变化 , ...

最新文章

  1. C++类的案例(一)
  2. 在CentOS 6.9 x86_64的nginx 1.12.2上开启标准模块ngx_http_map_module实录
  3. 2015年下半年计划
  4. 2011年1月和2月blog汇总:Orchard、敏捷个人、英语
  5. 圣诞日记2010-12-25:认清形势,看清方向,正确选择,努力拼搏(更新 )
  6. react中component存在性能问题
  7. linux swi 内核sp,Linux内核分析课程8_进程调度与进程切换过程
  8. Linux C:管道的实现原理,命名管道
  9. mysql md5版本校验_MySQL查询以名称的md5版本更新所有条目?
  10. 看完白鹤滩水电站建造历程 感觉《流浪地球》那些真能造出来
  11. Spring Boot 一个依赖搞定 session 共享,没有比这更简单的方案了!
  12. 双十一有“后悔药”了?淘宝88VIP将推出退货秒退款服务
  13. python selenium等待特定网页元素加载完毕
  14. 苹果Mac 软件出现「意外退出」及「打不开」解决方法
  15. 如何快速调整SMT贴片编程中的特殊元件角度?
  16. React Hooks 详解
  17. 关系图 antv G6
  18. util.Date和sql.Date之间的转换
  19. 微信WeChatHelper3.1.0.72逆向-微信WeChatHelper3.1.0.72接口(WeChatHelper3.1.0.72.dll)-VC++调用实例方法(win32)
  20. [ 重 新 预 习 ] Node.js搭建服务

热门文章

  1. 【JWT】JWT+HA256加密 Token验证
  2. 全球信息数据量陡增 大数据应用前景广阔
  3. spring源码解析(一)---占位符解析替换
  4. PowerShell在Exchange2010下快速开启邮箱[续]
  5. 3.企业安全建设入门(基于开源软件打造企业网络安全) --- 业务网安全加固
  6. 6.Linux 高性能服务器编程 --- 高级 I/O 函数
  7. 12. 指针、句柄、引用的区别
  8. 20.Linux 账号管理与 ACL 权限设置
  9. 29. 在magento CMS中的标签变量使用
  10. 58. Attribute item() 方法