支持B+树索引的存储引擎有InnoDB、MyISAM和Memory,其中只有InnoDB支持聚簇索引,InnoDB会在创建表的时候默认给主键列创建一个B+树索引,如果表没有主键,则InnoDB会默认找寻表中的非空唯一字段来创建索引,如果没有这样的列InnoDB则会隐式的定义一个主键然后创建聚簇索引(MyISAM可以没有主键,但是也会默认选择一个非空字段创建索引)。B+树索引创建时都只有一个根页面且这个根页面的位置保持不变,这时向表中插入数据后,页面会以单向链表的方式给索引列进行排序后存储(如果是聚簇索引则第一个字段就是索引列data域就是用户记录,非聚簇索引中如果表的存储引擎是MyISAM则是每条记录包括索引列和数据的地址值,因为MyISAM中数据会依次存入.MYD文件中然后再在.MYI文件中记录索引信息,InnoDB中则是记录聚簇索引列的值,此时通过非聚簇索引进行查询时则会先查非聚簇索引拿到主键值,然后再回表既查询聚簇索引拿到数据,MyISAM、InnoDB的非聚簇索引查询效率对比的话,MyISAM的查询效率更高点),如果存储的数据超过数据页的上限(默认是16KB)则根页面会先复制页面中的内容到一个新页面,再进行页分裂创建一个新页面记录新插入的内容,两个叶子节点则为双向链表,根页面接着擦除原本存储的数据,改为记录两个数据页的主键列最小的一条数据的值和页码,如果表中创建了二级索引比如创建时间字段,则可能会出现两条目录页记录数据索引列的值相同的情况,那么在这个时候需要再加上主键值记录保证内节点记录数据的唯一性。随着表中存储的数据越来越多,则一个数据页都无法记录所有的叶子节点,那么再进行一次升级,根节点再复制数据到一个新的数据页,并将新增的记录放到一个新的数据页,自己则记录这个新节点的每个页面的最小的索引列和页码,这个过程不会无限次进行的,最多会有四级节点。另外MyISAM表中的二级索引存储的数据和主键索引类似,叶子节点存储的是索引列和地址值。
MYSQLB+树索引学习
于 2024-02-19 16:32:27 首次发布