虽然InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。

第一个重大区别是InnoDB的数据文件本身就是索引文件。从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。

![](https://box.kancloud.cn/2015-07-07_559b7873b514d.png)

图10

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

第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域。例如,图11为定义在Col3上的一个辅助索引:

![](https://box.kancloud.cn/2015-07-07_559b7873ceaf1.png)

图11

这里以英文字符的ASCII码作为比较准则。聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。

了解不同存储引擎的索引实现方式对于正确使用和优化索引都非常有帮助,例如知道了InnoDB的索引实现后,就很容易明白为什么不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。再例如,用非单调的字段作为主键在InnoDB中不是个好主意,因为InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键则是一个很好的选择。

下一章将具体讨论这些与索引有关的优化策略。

innodb 索引 mysql_InnoDB索引实现相关推荐

  1. InnoDB调优-索引优化策略

    2019独角兽企业重金招聘Python工程师标准>>> 1.覆盖索引 覆盖索引(Covering Index)也叫索引覆盖,最早是在 InnoDB Plugin 中完成的,MySQL ...

  2. mysql 辅助索引_MySQL InnoDB B+tree索引

    假设我们知道 InnoDB 数据页的结构,知道了各个数据页可以组成一个双向链表,而每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表,每个数据页都会为存储在它里边儿的记录生成一个页目录,在通 ...

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

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

  4. mysql数据库存储引擎和索引的描述_Mysql InnoDB引擎的索引与存储结构详解

    前言 在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的. 而MySql数据库提供了多种存储引擎.用户可以根据不同的需求为数据表选择不同的存储引擎,用户也 ...

  5. MySQL中InnoDB引擎对索引的扩展

    摘要:InnoDB引擎对索引的扩展,自动追加主键值及其对执行计划的影响. MySQL中,使用InnoDB引擎的每个表,创建的普通索引(即非主键索引),都会同时保存主键的值. 比如语句 CREATE T ...

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

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

  7. mysql InnoDb存储引擎索引

    B+树索引:使用B+树索引查找数据时,并不能找到一个给定键值的具体行,只是找到被查找数据行所在的页,然后数据库通过把页读取到内存,再在内存中进行查找,最后得到要查找的数据. 聚集索引:按照表中主键构造 ...

  8. MySQL之InnoDB主键索引的B+树的高度计算

    文章目录 MySQL之InnoDB主键索引的B+树的高度计算 1.高度为2和3.主键bigint类型.一行记录数据大小1k MySQL之InnoDB主键索引的B+树的高度计算 1.高度为2和3.主键b ...

  9. InnoDB中的索引

    InnoDB中的索引 InnoDB中的索引是按照B+树来组织的,我们知道B+树的叶子节点用来放数据的,但 是放什么数据呢?索引自然是要放的,因为B+树的作用本来就是就是为了快速检索数据 而提出的一种数 ...

  10. mysql基础-InnoDB 中的索引

    1. InnoDB 中的索引 InnoDB 中的索引自然也是按照 B+树来组织的,前面我们说过 B+树的叶子节 点用来放数据的,但是放什么数据呢?索引自然是要放的,因为 B+树的作用本 来就是就是为了 ...

最新文章

  1. [译] 写给前端开发者的 GraphQL 指南
  2. 关于事件相关电位SSVEP应用于视频游戏的研究
  3. 使用 python 3.6 和 Vmware WorkStation 构建一个小型虚拟局域网通讯程序
  4. .NET大型Web站点StackOverflow架构分析
  5. SpringBoot中的Profile配置的使用
  6. 单机运行环境搭建之 --CentOS-6.4安装MySQL 5.6.10并修改MySQL的root用户密码
  7. 使用BigQuery分析GitHub上的C#代码
  8. ntp如何确认与服务器偏差_CentOS 8 启用 NTP 服务
  9. 《C++标准程序库》学习笔记5 — 第七章
  10. 企业案例(二):增量恢复案例
  11. (22)css3新增边框圆角属性border-radius
  12. 【ElasticSearch】es 线程池 ThreadPool 的封装
  13. python网络爬虫入门(三)—— 做个简陋的pixabay 图片下载器
  14. 5个高质量平面设计素材网站
  15. linux opessl下载_linux Download openssl-1.0.2下载 openssl安装步骤
  16. 弘辽科技:拼多多新店推广的5个方法是什么?怎么推广?
  17. LCD6210字符型液晶显示器 (1)
  18. C语言 键盘输入年月日,计算该年第几天
  19. Linux实时调度策略(SCHED_RR)和CFS(SCHED_OTHER)之间的区别
  20. 杰理芯片之程序跑飞,重启,不能运行

热门文章

  1. [原]MS SQL表字段自增相关的脚本
  2. 转:PyDev for Eclipse 简介
  3. 完美解决VB中int to short溢出问题
  4. 二分图的匹配(未完)
  5. 小米笔试题--数组移动
  6. MacOS平台上编译 hadoop 3.1.2 源码
  7. 开始使用Filebeat
  8. STM32基础分析——USART的DMA模式
  9. poj3083Children of the Candy Corn(dfs+bfs)
  10. [经验]修改SDI主窗口Title