一 前言
Mysql有覆盖索引 辅助索引 唯一索引 hash索引 B-Tree索引
二 底层数据结构分析
首先 **索引是高效获取数据的数据结构.**就像书中的目录一样 我们可以通过它快速定位到数据所在的位置,从而提高数据查询的效率
2,1 hash 索引
需要注意的是 mysql没有显式支持的hash索引,而是作为一种内部优化,对于热点数据会自动生成hash索引 也叫做自适应hash索引
hash索引在等值查询中 可以o(1)时间复杂度定位到数据 效率非常高 但是不支持范围查询 如:redis中的hash数据结构
2.2 B-Tree(多路搜索树 并不是二叉的)
B-Tree结构可以减少定位记录时所经历的中间过程,从而加快存取速度
2.3 B+ 树
B+ 树 是基于B-Tree 升级后的一种数据结构 通常用于数据库和操作系统的文件系统中
B+树的特点是能够保持数据稳定有序 其插入与修改有较稳定的对数时间复杂度。B+树元素自底向上插入 这与二叉树恰好相反
两者区别:
- B+ Tree只在叶子节点存储数据,而B-Tree的数据结构存储在各个节点中
2.B+ Tree的叶子节点间通过指针连接 可以通过遍历叶子节点即可获取所有数据
三 数据组织方式
根据数据的组织方式 可以分为聚簇索引和非聚集索引
3.1聚簇索引 (在InnoDB 聚簇索引和主键索引概念等价)
就是按照每张表构造一颗b+tree,同时叶子节点存放了整张表的行记录数据
原则上MYSQL中规定所以每张表都必须有主键索引,主键索引只能有一个,不能为null,同时必须保证唯一性 建表时若没有指定主键索引,则自动会生成一个隐藏的字段作为主键索引。
3.2非聚集索引(辅助索引)
非聚集索引又可以称之为非主键索引,辅助索引二级索引。主键索引的叶子节点存储了完整的数据行,而非主键索引的叶子节点存储则是主键索引值 通过非主键索引查询数据时 会先查到主键索引 然后再到主键索引上去查找对应的数据 这个过程叫回表
需要补充的是MYISAM中索引和数据文件分开存储,所有的索引都是非聚簇索引,B+ Tree的叶子节点存储的是数据存放的地址 而不是具体的数据
3.3 覆盖索引
上文提到一个回表的概念 即如果通过非主键索引查询数据时 会先查到主键索引的值 然后在去主键索引中查询具体的数据 整个查询过程需要扫描两次索引 显然回表是一个耗时操作。
为了减少回表次数 在设计索引时 我们可以将索引中包含要查询的结果 在辅助索引中检索到数据后直接返回 而不需要进行回表操作
原则上 使用覆盖索引的前提是字段比较短 对于值长度较长的字段则不适合使用覆盖索引
原因 索引一般存储在内存中 如果占用空间较大 则可能会从磁盘中加载 影响性能
3.3复合索引
复合索引的索引数据顺序跟字段的顺序相关 包含多个值的索引中 如果当前字段的值重时 将会按照其后面的值进行排序
3.4 唯一索引(索引唯一)
唯一索引 不允许具有索引值相同的行,从而禁止索引或键值
系统在创建该索引时检查是否有重复的键值 并在每次使用insert 或者update语句添加数据时进行检查 如果有重复的值 则操作失败