B+Tree实现原理和基本知识
MyISAM 索引(叶子节点存放指向记录地址)
MyISAM 引擎使用 B+Tree 作为索引结构,叶节点的 data 域存放的是数据记录的地址
上图中,我们以Col1为主键primary Key。
-
对于B+Tree而言,非叶子节点存放的是键值+指向子节点的指针
-
对于MyISAM而言,在B+Tree中,将叶子节点中的data存放的是实际记录的地址
-
记录数据并非聚集在叶子节点当中,因此,MyISAM 的索引方式也叫做“非聚集索引”
MyISAM主键索引和辅助索引
上图即为主键索引
MyISAM的辅助索引其实更主键索引类似
Col2列建立索引,得到的辅助索引结构跟上面的主键索引的结构是相同的。
Innodb 索引(叶子节点存放记录数据)
Innodb引擎使用 B+Tree 作为索引结构,叶子节点的 data 域存放的是数据记录
将记录数据放入叶子节点当中,相比MyISAM而言,少一次磁盘IO,因为不用读取叶子节点中指向实际位置中的记录数据
特点
-
对于B+Tree而言,非叶子节点存放的是键值+指向子节点的指针
-
对于Innodb而言,在B+Tree中,将叶子节点中的data存放的是实际记录。
-
记录数据聚集在叶子节点当中,因此,Innodb的索引方式也叫做“聚集索引”
注意:
1、InnoDB 要求表必须有主键(MyISAM 可以没有),如果没有显式指定,则 MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL 自动为 InnoDB 表生成一个隐含字段作为主键,类型为长整形。(innodb支持事务,行锁,外键。MyISAM引擎不支持事务,是表锁)这就是为什么mysql默认使用innodb引擎的原因之一。
通过命令
show engines;
2、使用 InnoDB ,应该采用自增字段做表的主键。因为索引的实现是B+Tree拥有排序,快速查找的功能。当增加记录时,记录磁盘存储,会在页中增加键值,和指向该节点的指针。如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。每次插入新记录,更新索引不需要,对B+Tree节点进行移动,效率高
Innodb主键索引和辅助索引
主键索引
辅助索引
innodb中辅助索引(不是primary Key的索引),跟innodb主键索引差别较大
这次我们以数据表中的Col3列的字符串数据建立辅助索引,我们来看下面的图:
在最底层的叶子结点有两行数据,第一行的字符串是辅助索引,按照ASCII码进行排序,第二行的整数是主键的值。
注意:innodb中的辅助索引,叶子节点中data区域指向的对应主键