Loading

mysql B+Tree索引的一点理解

1.聚集索引

聚集索引就是按照每张表的主键构建一个B+树,同时叶子节点中存放的即为整行记录,聚集索引这个特性决定了索引组织表中的数据也是索引的一部分,同时B+树数据数据结构一样,每个数据页都通过一个双向链表来记性链接(通过主键查询是不需要进行回表操作的)

2.辅助索引

辅助索引又被称为非聚集索引,叶子节点并不包含行记录的全部数据,叶子节点除了包含键值以外,还包含主键键值,如果谓词条件中只有辅助索引包含的列,那么需要从辅助索引的根节点找到叶子节点,通过叶子节点对应的主键键值,再从主键索引的根节点找到主键索引的叶子节点,然后将数据取出来

数据库执行一下查询,通过辅助索引name这个列的过程就是如下所示:

create table t1(id int,name varchar(20),class int,primary key(id),key(name));

select id,name,class from t1 where name='xxx';

3.引申问题

1.当某个表没有创建主键索引,仅仅创建了一个普通索引,那么MySQL是如何进行检索数据的呢?

MySQL会默认生成一个6字节的指针_rowid,这里的普通索引存放的就是(键值,_rowid),以此来进行数据的访问,但是这个是有长度限制的,当到达2^48这个值之后,就会从0继续开始,如果我们的数据足够大,那么这个值是可以达到的,对于没有主键的查询显然是不准确的,可能一个查询会返回两个值。这就是为什么MySQL一定要创建主键索引的原因。

2.当某个表没有主键索引,只有一个普通非唯一索引,添加主键索引会发生什么呢?

根据我的理解,表会进行重建,根据非聚集索引定义,非聚集索引要存放主键索引的键值,因此也会进行重建。

 

 

posted @ 2021-09-09 16:00  李行行  阅读(58)  评论(0编辑  收藏  举报