索引介绍
索引定义
高效获取数据的数据结构。具体参考官方。
优缺点
优:
提高检索效率,降低IO成本
通过索引列对数据进行排序,能降低排序成本、降低CPU消耗
- 被索引的列会自动进行排序,组合索引的排序比较复杂。
- WHERE中的索引列,在存储引擎层处理,专业叫法是:索引下推ICP
- 覆盖索引 select字段(字段是索引)
缺:
占磁盘空间
增删改的效率低
索引分类
单列索引
组合索引
全文索引
空间索引
位图索引
索引原理
索引存储结构
索引在存储引擎中实现,不同存储引擎,会使用不同索引
InnoDB只支持B+ Tree索引,不能更换
简单介绍B+ Tree:所有数据在叶子节点,并且是排过序的。具体实现请自学(可与B树进行对比学习)。
索引树的高度不能太大,否则影响IO次数。
非聚集索引 MyISAM
索引和数据是分开的。
主键索引
聚集索引 InnoDB
主键索引
叶子节点挂载了全部数据
要尽量建主键
否则:MySQL找唯一字段当主键,如果没有,会自动建立一个伪列做主键,影响效率
主键尽量不要用UUID,因为UUID排序不好排。如果分布式存储,那么可以用雪花算法、或者用redis生成。
辅助索引(次要索引)
叶子节点挂载的是主键值
非主键查询,会搜索两次索引树。从这也能看出为啥不推荐UUID或联合主键,占空间太多。
举例:
SELECT * FROM TABLE1 WHERE ID=18;--搜索一颗索引树
SELECT * FROM TABLE1 WHERE NAME='HILL';--搜索两颗索引树,俗称回表
SELECT NAME FROM TABLE1 WHERE NAME='HILL';--搜索一颗索引树
SELECT ID,NAME FROM TABLE1 WHERE NAME='HILL';--搜索一颗索引树
如何让SELECT * FROM TABLE1 WHERE NAME=‘HILL’;也搜索一颗索引树?
通过组合索引
引入概念:覆盖索引,利用组合索引完成在辅助索引树的遍历,不回表。