索引的种类
Hash索引
即把key键值的hash值作为索引,在查找时对key做hash,即可一次定位。这种索引非常快,甚至比b树快,因为它不需要从根节点开始一层一层找。一步到位。
但是hash索引也有很多缺点,比如:
- 只能满足等值查询,不支持范围查找,显然,hash值并没有大小排序一说
- 没法进行任何排序操作,因为key值的大小和hash值的大小没关系,这点和第一点有点类似
- hash索引没法避免全表扫描。其实这个问题也是来自于hash冲突,不同的key值可能会对应相同的hash值,当出现这种情况时,mysql又需要去全表扫描对比实际值。所以当表数据变多,hash冲突变多以后,hash索引的效率也是很低的。
b+树
B+树和二叉树、平衡二叉树一样,都是经典的数据结构。B+树由B树和索引顺序访问方法(ISAM,是不是很熟悉?对,这也是MyISAM引擎最初参考的数据结构)演化而来,但是在实际使用过程中几乎已经没有使用B树的情况了。
B+树的定义十分复杂,因此只简要地介绍B+树:B+树是为磁盘或其他直接存取辅助设备而设计的一种平衡查找树,在B+树中,所有记录节点都是按键值的大小顺序存放在同一层的叶节点中,各叶节点指针进行连接。
b树与b+树的区别
- b树的所有节点都存了实际的数据值,而b+树非叶子节点只存索引,实际值都存在叶子节点
- b+树的层次是固定的,查找每个数据,磁盘的io次数都是一样的(因为树的高度是稳定的);但b树不一定,b树的查找有可能会提前结束。