一、索引的数据结构
索引说白了就是用一个数据结构组织某一列的数据,然后如果你要根据那一列的数据进行查询的时候,就可以不进行全表扫描,只要根据那个特定的数据结构去找到那一列中的值,然后却找到相对应的记录的物理地址即可。
MySQL的索引是使用B+树这种数据结构来实现的,要解释B+树,首先要解释清楚B-树:
比如我们现在有一张表:
{
id int
name varchar
age int
}
我们现在对id建了一个索引,这些值就存在了如上图的B-树中,B-树是一种排好了序的数据结构;
要查找id为某个值的记录时,直接从根节点开始二分查找即可。
B+树与B-树的区别:
非叶子节点不存储data,叶子节点不存储指针,如图:
要查找id为某个值的记录时,必须要到叶子节点才能拿得到要找的data;
数据库的索引一般都对B+树进行了优化,加上了顺序访问的指针。
二、MyISAM引擎的索引实现
MyISAM最大的特点是数据文件和索引文件时分开的,叶子节点的data中存的是要找记录的物理地址的值,如0x07,代表数据文件中的记录地址;
三、InooDB引擎的索引实现
要求必须有主键,默认会根据主键创建一个索引;
InnoDB的数据文件本身同时也是一个索引文件,这个索引就是默认根据主键建立的,称为聚簇索引;正是因为这个原因,InnoDB表是要求必须有主键的,但是MyISAM表不要求必须有主键;
另外值得一提的是,在InnoDB引擎下,如果对某个非主键的字段创建一个索引,那么这个索引中,叶子节点的值就是主键的值,再根据主键的值到聚簇索引中再次进行查找,得到数据。
在InnoDB存储引擎中,对于同样的索引文件:
data存储的就不再是0x07这样的物理地址的值,data中存放的就是完整的一行数据,如(15,张三,22)。