索引是什么?索引就是一种数据结构,目的是为了加快查询速度。
既然是为了加快查找的数据结构,那就有以下几种选择。
1.hash索引。2.树。
选择hash索引:hash索引虽然查找是o(1)级别的,但是不能进行范围查询。比如要查找年龄20~30的,只能进行全表扫描,也就是对于范围查找索引失效,会进行全表扫描。
选择树结构:查找算法如果是有序的就可以选择二分法查找,为了使用二分法的数据结构有树。树的选择方案很多,有二叉树,b树,红黑树等。mysql默认使用的是B+树。
二叉树,B树有一个最大的缺点就是磁盘io次数多。因为一个节点就是一个磁盘块,二叉树每个节点只存储一行数据,也就是说一次磁盘io只能读取到一行,通常需要nlogn次磁盘io才能找到查找的数据,B数一个节点倒是可以存储多行数据,但是他也把每一行非索引列数据也存进来占用空间,要知道操作系统是以页为单位进行磁盘io的,一页是4KB,即虽然一个节点存储了多行,但是你一次io读4kb,需要读取多次才能全部读取完成这个节点的数据。
因此我们选择b+树,它的特点是一个节点存储多行数据,并且只存储了索引列的数据,全部列的数据是放在最后的叶子节点的。这里需要注意对于主键索引,叶子节点存储(存的是磁盘物理地址)的所有列的数据,。非主键索引存的是主键索引的地址,根据非主键索引找到主键索引就叫回表查询。