Mysql索引整理
最左匹配
对于多列索引,总是从索引的最前面字段开始,接着往后,中间不能跳过。比如创建了多列索引(name,age,sex),会先匹配name字段,再匹配age字段,再匹配sex字段的,中间不能跳过。
mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配。
B+树是从左到右的顺序来建立搜索树的,所以检索数据时也是按照从左到右的顺序来检索的。
联合索引为 < a, b, c > , a、b、c均为表中一列。
abc建立索引相当于a,ab(ba),abc建立索引(顺序可以乱,但要有a)
索引划分
从逻辑角度
- 主键索引:主键索引是一种特殊的唯一索引,不允许有空值
- 普通索引或者单列索引:每个索引只包含单个列,一个表可以有多个单列索引
- 多列索引(复合索引、联合索引):复合索引指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用复合索引时遵循最左前缀集合
- 唯一索引
- 全文索引
从数据结构的角度
- B+树索引:最常见的索引类型,基于B+树数据结构(InnoDB和MyISAM引擎、memory引擎)
- Hash索引:基于hash表,所以只支持精确查找(时间复杂度O(1)),不支持范围查找(Memory引擎)
- 全文索引:主要用来查找文本中的关键字(MyISAM,InnoDB)
- 空间索引:基于R树实现,用于地理数据存储(MyISAM)
从物理存储角度
- 聚簇索引:表中记录的物理顺序与键值的索引顺序相同,数据库主键就是聚簇索引
- 非聚簇索引:表中记录的物理顺序与键值的索引顺序不相同 Mysql中InnoDB引擎的主键索引为聚簇索引,MyISAM存储引擎采用非聚簇索引
常见问题
为什么使用B+树呢?
- 因为b+树的高度固定,可以有效的控制io次数,并且在一个页中可以存储更多的索引值。
- 非叶子节点只能存储索引,叶子节点才存储数据。叶子节点是按照大小排序的,比较便于查找。范围查询更好。
- 索引和数据分开存储,让更多的索引存储在内存中。
真实的数据存在于叶子节点;
非叶子结点不存储真实数据,只存储指引搜索方向的数据项;
为什么不用其他数据结构?
平衡二叉搜索树过于严格在插入数据时可能要进行大量的数据移动
红黑树的深度过大,数据检索时造成磁盘IO频繁
B-Tree和红黑树对于顺序查询并不友好
覆盖索引的好处
避免Innodb表进行索引的二次查询
Innodb是以聚集索引的顺序来存储的,对于Innodb来说,二级索引在叶子节点中所保存的是行的主键信息,
如果是用二级索引查询数据的话,在查找到相应的键值后,还要通过主键进行二次查询才能获取我们真实所需要的数据。而在覆盖索引中,二级索引的键值中可以获取所有的数据,避免了对主键的二次查询 ,减少了IO操作,提升了查询效率。