索引的存储结构html
索引存储结构算法
索引是在存储引擎中实现的,也就是说不一样的存储引擎,会使⽤不一样的索引
MyISAM和InnoDB存储引擎:只⽀持B+ TREE索引, 也就是说默认使⽤BTREE,不可以更换
MEMORY/HEAP存储引擎:⽀持HASH和BTREE索引
B树和B+树
数据结构示例⽹站:
https://www.cs.usfca.edu/~gal...
B树图示
B树是为了磁盘或其它存储设备⽽设计的⼀种多叉(下⾯你会看到,相对于⼆叉,B树每一个内结点有多个分⽀,即多叉)平衡查找树。 多叉平衡
B树的⾼度⼀般都是在2-4这个⾼度,树的⾼度直接影响IO读写的次数。
若是是三层树结构---⽀撑的数据能够达到20G,若是是四层树结构---⽀撑的数据能够达到⼏⼗T数据结构
B树和B+树的区别
B树和B+树的最⼤区别在于⾮叶⼦节点是否存储数据的问题。spa
⾮汇集索引(MyISAM)
B+树叶⼦节点只会存储数据⾏(数据⽂件)的指针,简单来讲数据和索引不在⼀起,就是⾮汇集索引。
⾮汇集索引包含主键索引和辅助索引都会存储指针的值设计
主键索引
这⾥设表⼀共有三列,假设咱们以 Col1 为主键,则上图是⼀个 MyISAM 表的主索引(Primary key)示意。
能够看出 MyISAM 的索引⽂件仅仅保存数据记录的地址。指针
辅助索引(次要索引)
在 MyISAM 中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求 key 是惟⼀的,⽽辅助索引的 key 能够重复。若是咱们在 Col2 上建⽴⼀个辅助索引,则此索引的结构以下图所示
一样也是⼀颗 B+Tree,data 域保存数据记录的地址。所以,MyISAM 中索引检索的算法为⾸先按照B+Tree 搜索算法搜索索引,若是指定的 Key 存在,则取出其data 域的值,而后以 data 域的值为地址,读取相应数据记录。htm
汇集索引(InnoDB)
主键索引(汇集索引)的叶⼦节点会存储数据⾏,也就是说数据和索引是在⼀起,这就是汇集索引。
辅助索引只会存储主键值
若是没有没有主键,则使⽤惟⼀索引建⽴汇集索引;若是没有惟⼀索引,MySQL会按照⼀定规则建立汇集索引。blog
主键索引
1.InnoDB 要求表必须有主键(MyISAM 能够没有),若是没有显式指定,则 MySQL系统会⾃动选择⼀个能够惟⼀标识数据记录的列做为主键,若是不存在这种列,则MySQL ⾃动为 InnoDB 表⽣成⼀个隐含字段做为主键,类型为⻓整形。
上图是 InnoDB 主索引(同时也是数据⽂件)的示意图,能够看到叶节点包含了完整的数据记录。这种索引叫作汇集索引。由于 InnoDB 的数据⽂件自己要按主键汇集索引
辅助索引(次要索引)
2.第⼆个与 MyISAM 索引的不一样是 InnoDB 的辅助索引 data 域存储相应记录主键的值⽽不是地址。换句话说,InnoDB 的全部辅助索引都引⽤主键做为 data 域。
汇集索引这种实现⽅式使得按主键的搜索⼗分⾼效,可是辅助索引搜索须要检索两遍索引:⾸先检索辅助索引得到主键,而后⽤主键到主索引中检索得到记录。
select * from user where name='Alice' 回表查询 检索两次 ⾮主键索引 --- pk---索引--->数据
select id,name from user where name='Alice' 不须要回表 在辅助索引树上就能够查询到了 覆盖索引(多⽤组合索引)get
引伸:为何不建议使⽤过⻓的字段做为主键?
由于全部辅助索引都引⽤主索引,过⻓的主索引会令辅助索引变得过⼤。
同时,请尽可能在 InnoDB 上采⽤⾃增字段作表的主键。
MyISAM 和 InnoDB的存储结构图示
为了更形象说明这两种索引的区别, 咱们假想⼀个表以下图存储了 4 ⾏数据。 其中Id 做为主索引,Name 做为辅助索引。 图示清晰的显示了聚簇索引和⾮聚簇索引的差别: