索引的分类
1.聚集索引(主键索引)
- InnoDB引擎是B+树索引组织而成的。B+树的叶子节点存储的都是数据段的数据
- InnoDB对数据的存储必须依赖于主键,主键对应的索引叫聚集索引。假设你没有建主键,InnoDB会从表中寻找第一个非空的唯一索引作为聚集索引,但如果这也找不到,会生成一个不可见的ROW_ID的列,该列是一个6字节的自增数字,用来生成聚集索引。
- 对于ROW_ID列的自增实现其实是来自于一个全局自增序列,这意味着所有使用到ROW_ID作为聚集索引的表都共享该序列,如果在高并发的情况就有保证不了唯一性的可能。
2.索引的数据结构
- B tree :B树是二叉树的升级版,又叫平衡多路查找树。每个节点都存放数据
- B+ tree :B+ 树是应文件系统所需而产生的一种 B树的变形树(文件的目录一级一级索引,只有最底层的叶子节点(文件)保存数据)非叶子节点只保存索引,不保存实际的数据)。
3.B树和B+树的区别
B+树非叶子节点只保存索引,所有数据保存在叶子节点,叶子节点按照从小到大通过指针串起来的,所以B+树在范围查找会更快
4.B+树的优势
对于 B 树和 B+ 树来说,两种数据结构都是为了减少磁盘 I/O 读写过于频繁而生,可以让每层放尽量多的节点,以此来降低整棵树的高度。 b+树相比于b树的优点:
- B+树的磁盘读写代价更低
数据的聚集程度直接也影响了查询磁盘的次数 - B+ 树查询效率更加稳定
树高确定的前提下所有的数据都在叶子节点,那么无论怎么查询所有关键字查询的路径长度是固定的。 - B+ 树对范围查询的支持更好(最大的优势)
B+ 树所有数据都在叶子节点,非叶子节点都是索引,那么做范围查询的时候只需要扫描一遍叶子节点即可;而 B 树因为非叶子节点也保存数据,范围查询的时候要找到具体数据还需要进行一次中序遍历。
5.MyISAM 和 InnoDB 存储引擎的索引区别
- MyISAM 也是使用 B+ 树作为索引存储结构,他的叶子节点 data 域存放的是数据的物理地址,即索引结构和真正的数据结构其实是分开存储的。也就是data放的是指针。
- MyISAM 索引和数据是分离的,但是在 InnoDB 中却大不相同,InnoDB中采用主键索引的方式,所有的数据都保存在主键索索引中叶子节点。即主键直接挂记录,基于主键来存储数据。所以这也是为什么 InnoDB 要求每个表都必须要有主键的原因。
6.索引的缺点
|