B+树索引并不能找到一个给定键的具体行。B+树索引能找到的只是被查找数据行所在的页。
然后数据库通过把页读入内存,再在内存中进行查找,最后得到要查找的数据。
B+树(平衡多路查找树):
B+树是为了磁盘或其它直接存取设备设计的一种平衡多路查找树。在B+树里是,所以记录节点都是键值的大小顺序存放在同一层的叶子节点上,由各叶子节点指针进行连接。
B+树索引在数据库中有高扇出性的特点,因此在数据库中,B+树的高度一般在2~4层,也就是说查找某一键值的行记录时最多只需要2~4次IO.
数据库中的B+树索引可以分为聚集索引和辅助索引,其内部都是B+树的,高度平衡,叶子节点存放着数据。
聚集索引和辅助索引不同的是,叶子节点存放的是否是一整行的信息。
聚集索引:
InnoDB存储引擎表是索引组织表,即表中数据按照主键顺序存放。而聚集索引就是按照每张表的主键构造一棵B+树,同时叶子结点中存放的即为整张表的行记录数据,也将聚集索引的叶子节点称为数据页。
由于实际的数据页只能按照一棵B+树进行排序,因此每张表只能拥有一个聚集索引。
聚集索引的存储并不是物理上连续的,而是逻辑上连续的。
一:页通过双向链表链接,页按照主键的顺序排序;
二:每个页中的记录也是通过双向链表进行维护的,物理存储上可以同样不按照主键存储。
聚集索引对于主键的排序查找和范围查找速度非常快。
辅助索引:
对于辅助索引,叶子结点并不包含行记录的全部数据。叶子结点除了包含键值以外,每个叶子节点中索引行中还包含了一个相应行数据的聚集索引键(InnoDB引擎下)。
当辅助索引寻找数据时,InnoDB存储引擎会遍历辅助索引并通过页级别的指针获取只指向主键索引的主键,然后再通过主键索引来找到一个完整的行记录。
ALTER TABLE tablename ADD INDEX indexname (index_col,....)
ALTER TABLE tablename DROP INDEX indexname (index_col,....)
CREATE INDEX indexname ON tablename
DROP INDEX indexname ON tablename