一、数据库索引的本质是采用B+树
B-树与B+树
都是排序树
- B+数叶子节点之间有指针相连,方便进行范围查找。
- B+树的非叶子节点都只存储索引值。而不存储data值,data是指表中行元素所在的磁盘地址指针。
- B+树中除了叶子节点以外的节点都只存储索引,而B-树存储了索引和data,所以一个节点B+树能存储更多元素。
- B+树中每一个节点的大小为16kb,其中一般一个索引所需的空间是8B,因为数据库数据一般是BigInt类型,其大小为8B。索引旁边的指针一般成对出现,用于指向下一级节点,其大小mysql源码分配一般为6B。所以存储一个索引大概需要14个字节空间。故B+树中一个节点所能存储的索引个数为16KB/14B=1170.
索引是怎么支持千万级别的表的快速查找的
因为索引底层采用的是B+树,B+树非叶子节点只存储索引且每一个非叶子节点能够存储大概1170个索引值,2层的B+数就能够存储1170平方个数据。又通过B+数的对半查找能够很快找到相应的索引值及其对应的行数据磁盘地址指针。
索引方法可以用B树和hash结构来实现,为什么不推荐用hash结构?
底层采用hash表来存储时,会对索引进行hash运算,虽然非常方便查找具体的数据,但是当条件为where id > 5这种运算时也就是求索引的hash值大于5的hash值这种情况就无法得出结果。
myisam存储引擎索引实现(形容表)
具体实现过程
查询表中数据,首先mysql底层判断是否通过索引,使用索引首先去myi文件里面查询,得到具体数据的磁盘文件地址指针也就是MYD文件里面的偏移量,然后去MYD文件里面找到具体的行数据。
innoDB存储引擎索引实现(形容表)
聚集索引与非聚集索引
聚集(聚簇)索引:innoDB主键索引就是聚集索引,即数据和索引聚集在一个文件里面,ibd。
非聚集索引:myisam索引形式,即数据和索引分2个文件存储,myd和myi。
为什么InnoDB主键必须整型且自增?
整型是方便比较,效率高,并且所占用的磁盘空间少。
当往中间添加元素时,如果此位置节点的空间已经使用完了,就会导致树分裂或者树平衡,产生大量运算,所以主键必须自增。
例如:插入8
myisam和InnoDB存储引擎
myiSam使用非聚合索引而InnoDB使用聚合索引。
innoDB必须要有主键而且为整数自增。