创建mysql索引的时候经常有两种选择:BTREE和HASH,;两种索引区别很大。如下表格:
比较名称 | HASH | BREE | 备注 | |
---|---|---|---|---|
顺序 | 无序 | 有序 | BTREE数据是有序的,而hash是没有顺序的。 | |
效率 | 高 | 较低 | 理论上HASH查询效率较BTREE高。 | |
索引排序 | 不支持 | 支持 | HASH不支持排序,BTREE支持。 | |
部分索引 | 不支持 | 支持 | HASH不支持部分索引查询因为是无序的,而BTREE可以。 | |
避免全表扫描 | 不支持 | 支持 | HASH任何时候都无法避免全表扫描,而BTREE可以。 |
HASH的实现:hash是以key、value的形式存储,是通过hash索引计算出一个唯一的hash的key值,通过该key值进行全表匹配判断(组合索引也一样),查询出value值。当数据量非常大的时候会导致哈希碰撞问题,性能就会比btree慢。
BTREE的实现:btree也称为b+树,主要的实现是通过一个平衡二叉树进行判断范围查询,btree的性能比较稳定,不会出现很大的波动,基于索引的顺序扫描,也可以利用双向指针快速左右移动,效率非常高。
总结:btree适用于大部分的场景,并且也是非常实用,虽然说除了在少量数据(万级)场景下性能不如hash,但其它的特性与性能远超hash;所以在选择索引的时候需要考虑数据量与应用场景。