本问题参考: https://www.zhihu.com/question/410506694/answer/1368215298 ,答案为个人原创

MySQL innoDB引擎索引基于 B+树,B+树有以下特点:


图片参考自:链接

  • 每个节点中子节点的个数不能超过 N,也不能小于 N/2(不然会造成页分裂或页合并)
  • 根节点的子节点个数可以不超过 m/2,这是一个例外
  • m 叉树只存储索引,并不真正存储数据,只有最后一行的叶子节点存储行数据。
  • 通过链表将叶子节点串联在一起,这样可以方便按区间查找
  • 同时,InnoDB主键索引和非主键索引不一样。主键索引,叶子节点是行所有数据,非主键索引叶子节点只是这一列的数据以及指向主键的指针,如果需要其他列数据则需要通过主键指针查询聚簇索引。

然后,就需要提到一个概念,innodb_page_size。InnoDB引擎读取数据,是一页一页读取的,这是InnoDB读取一页数据的大小。
innodb_page_size 是一个初始化数据库实例的参数,在目前的版本中(>=5.7.6),可以选择的值有4096, 8192, 16384, 32768, 65536默认是16KB

一般越小,内存划分粒度越大,使用率越高,但是会有其他问题,就是限制了索引字段还有整行的大小。innodb引擎读取内存还有更新都是一页一页更新的,这个innodb_page_size决定了,一个基本页的大小。常用B+Tree索引,B+树是为磁盘及其他存储辅助设备而设计一种平衡查找树(不是二叉树)。B+树中,所有记录的节点按大小顺序存放在同一层的叶子节点中,各叶子节点用指针进行连接。MySQL将每个叶子节点的大小设置为一个页的整数倍,利用磁盘的预读机制,能有效减少磁盘I/O次数,提高查询效率。
对于主键索引,如果一个行数据,超过了一页的一半,那么一个页只能容纳一条记录,这样B+Tree在不理想的情况下就变成了双向链表,B+树失去了意义。对于非主键索引,那么索引列数据+主键指针数据超过一页的一半,也是同理。

最后,说一下索引字段大小限制:

索引字段大小限制

  • 关于innodb_large_prefix这个配置的限制:

    • 对于MySQL5.7.7之前,这个值默认是False,之后(包含5.7.7),这个值默认为True
    • 对于使用DYNAMIC或者COMPRESSED的Row Format,并且innodb_large_prefix为True,最大所以字段前缀的限制大小是3072 bytes(也就是字段的前3072bytes才会被索引)。如果这个配置是false,最大是767bytes。如果索引的字段,总长度超过这个限制,建表或者修改表就会报错。
    • 如果更改了配置或者行格式,导致最大限制从3072 bytes变为767bytes。对于现有的表这个限制是会生效的,但是已有的索引不会受影响,就是不能新建而已。
    • 这个配置未来过期掉,也就是说,在之后的版本中,默认索引字段前缀最大值为3072Bytes(不考虑Row Format)
  • 关于innodb_page_size这个数据库实例初始化配置:
    • 如果在创建数据库实例的时候修改了innodb_page_size这个参数(默认16KB),那么字段前缀的限制大小是3072 bytes这个限制也会改变。3072bytes对应16KB的innodb_page_size,1563bytes对应8KB,767对应4KB

每日一面 - 从 innodb 的索引结构分析,为什么索引的 key 长度不能太长?相关推荐

  1. 主码索引、聚集索引、非主码索引(辅助索引)、唯一索引、外键索引、复合索引、非主码索引、聚集主码(聚集索引)、单列索引、多列索引、普通索引等...

    强烈建议看了第一个参考文献再来看这个篇博文,因为此处不准备讲底层数据结构的实现. 索引:索引(Index)是帮助MySQL高效获取数据的数据结构.提取句子主干,就可以得到索引的本质:索引是数据结构.其 ...

  2. MySQL的索引原理,索引的类型有哪些,如何创建合理的索引,索引如何优化。

    欢迎大家关注我的公众号[老周聊架构],Java后端主流技术栈的原理.源码分析.架构以及各种互联网高并发.高性能.高可用的解决方案. 一.为什么需要索引? 索引是数据表种一个或者多个列进行排序的数据结构 ...

  3. mysql gis index 索引原理_Mysql 索引原理及优化

    Mysql 索引原理及优化 什么是索引 为什么需要索引? 索引是数据表种一个或者多个列进行排序的数据结构 索引能够大幅提升检索速度 创建.更新索引本身也会耗费空间和时间 查找结构进化史 线性查找:一个 ...

  4. MySQL(InnoDB剖析):24---B+树索引(聚集索引与非聚集索引(辅助索引))、B+树索引的分裂

    一.B+树索引概述 B+树索引的本质就是B+树在数据库中的实现.但是B+索引在数据库中有一个特点就是高扇出性,因此在数据库中,B+树的高度一般都在2~4层,也就是说查找某一键值的行记录最多只需要2~4 ...

  5. MySQL(InnoDB剖析):---B+树索引(聚集索引与非聚集索引(辅助索引))、B+树索引的分裂

    小伙伴们大家好!今天是大年三十,给大家拜个早年!在此小弟祝各位大哥们与家人团团圆圆,和和睦睦,新的一年身体健康,工作顺利! 一.B+树索引概述 B+树索引的本质就是B+树在数据库中的实现.但是B+索引 ...

  6. mysql技术内幕innodb存储引擎——表索引算法和锁_(转)Mysql技术内幕InnoDB存储引擎-表索引算法和锁...

    表 原文:http://yingminxing.com/mysql%E6%8A%80%E6%9C%AF%E5%86%85%E5%B9%95innodb%E5%AD%98%E5%82%A8%E5%BC% ...

  7. mysql InnoDB 聚集索引,二级索引

    InnoDB 索引分为聚集索引(聚簇索引)与二级索引. 聚集索引: 1: 全表唯一且必有一个,主键索引属于聚集索引. 2: 索引项的顺序就是表中数据记录的物理顺序. 3: 若定义了主键索引InnoDB ...

  8. MySQL的存储引擎InnoDB,B+Tree数据结构索引的实现原理图(聚簇索引/聚集索引)

    1.表数据文件本身就是按B+Tree组织的一个索引结构文件 2.InnoDB的B+Tree的索引数据结构中,表数据和索引数据合并在一起,即叶子节点包含了完整的数据记录,这样的索引叫聚簇索引.

  9. MySQL技术内幕InnoDB存储引擎(表索引算法和锁)

    表 4.1.innodb存储引擎表类型 innodb表类似oracle的IOT表(索引聚集表-indexorganized table),在innodb表中每张表都会有一个主键,如果在创建表时没有显示 ...

  10. 【MySQL优化(六)】InnoDB索引优化与索引规约

    序 上一篇讲解了建表规范后,本章重点分析下创建索引的一些规范 由于索引是工作在存储引擎层,所以以下规约都是基于InnoDB引擎 题外话 在满足语句需求的情况下, 尽量少地访问/消耗资源是数据库设计的重 ...

最新文章

  1. NBT:设计稳定无毒的抗菌肽杀灭耐药菌
  2. 【Nginx】基本数据结构
  3. embedding 层的详细解释
  4. android studio 引入arr的问题
  5. memcached 安装小结-1
  6. 自己抽取的柱状图MpAndroidChart
  7. adb安装apk报错Failure [INSTALL_FAILED_INVALID_URI]
  8. Linux eclipse+perl开发环境安装
  9. 那些年,我爬过的北科(十)——搜索案例之ElasticSearch的使用
  10. 概率论与数理统计【三】一维随机变量及其分布
  11. CS1.5制造机器人的命令
  12. ucore Lab1 系统软件启动过程
  13. IPv4 至 IPv6改造过渡方案
  14. Systrace 响应速度实战 1 :了解响应速度原理
  15. linux英文转换成中文
  16. 关于打开github网站慢如何解决
  17. php 获取用户是否关注微信公众号
  18. win10计算机恢复到一天前,Win10恢复电脑(刷新电脑)的方法步骤图文详解
  19. Java题目汇总(二)
  20. 深度剖析Linux内核(ARM体系结构)

热门文章

  1. 8.称呼/no/not/meet/nice/of/倒装句/介绍他人的方式/see
  2. 条件与循环Phython
  3. 【ELT.ZIP】OpenHarmony啃论文俱乐部——计算机视觉数据压缩应用
  4. Unity3D移动平台简单实现
  5. 软件自动化测试全套视频教程
  6. 为什么我停掉孩子所有的兴趣班,也没停掉编程!
  7. TP50 TP90 TP99 TP999 详细说明
  8. 常用邮箱服务器地址大全截止2020-9
  9. 手机无线访问计算机文件夹,电脑怎么通过无线wifi读取手机文件
  10. PyCharm设置背景颜色为白色