一.聚簇索引和非聚簇索引
在MySQL中,innodb引擎的索引储存是聚簇索引,myisam引擎的索引储存是非聚簇索引。
聚簇索引:将数据和索引放在一起,查询通过聚簇索引可以直接获取数据,相比非聚簇索引需要第二次查询(非覆盖索引的情况下)效率要高。聚簇索引对于范围查询的效率很高,因为其数据是按照大小排列的。
非聚簇索引:又叫二级索引。二级索引的叶子节点中保存的不是指向行的物理指针,而是行的主键值。当通过二级索引查找行,存储引擎需要在二级索引中找到相应的叶子节点,获得行的主键值,然后使用主键去聚簇索引中查找数据行,这需要两次B-Tree查找。
注:在实现MySQL的读写分离时,通常使用innodb引擎来写数据库(主),使用myisam引擎来读数据库(从)。
二.hash索引和BTree索引
在MySQL里常用的索引数据结构有B+树索引和哈希索引两种,在MySQL文档里,实际上是把B+树索引写成了BTREE,MySQL所用的索引是B+树索引。
两者区别:
1.hash是比btree快,但是hash只能进行等值查询=,<=>,hash索引不可以进行范围查询。btree索引可以进行范围查询。
2.数据量大的时候反而BTree较快。
3.在有大量重复键值情况下,哈希索引的效率也是极低的,因为存在所谓的哈希碰撞问题,两个对象计算出来的hash值有可能是相同的,不稳定。
4.哈希索引也没办法利用索引完成排序,以及like ‘xxx%’ 这样的部分模糊查询(这种部分模糊查询,其实本质上也是范围查询)。
5.哈希索引也不支持多列联合索引的最左匹配规则。