文章目录
- 索引的优缺点
- 索引的底层数据结构
- 索引类型
- 索引存储结构【不同存储引擎不同】
- 联合索引和覆盖索引
- 创建索引的注意事项
- 索引失效的情况
索引的优缺点
优点:能加快查找速度。【前提是数据量大,否则没啥用其实】
缺点:需要维护,牺牲空间。
索引的底层数据结构
- hash表【特点:无序】
- 优点: 单值查找快。
- 缺点:哈希冲突,并且不支持范围查找。
- B+树【特点:有序】
- 为什么不是平衡树、红黑树、B树,而是B+树呢?
- 简单来说,前面的几种树都有缺点。
- 平衡树:极限情况会退化成链表,就没有意义了。
- 红黑树:索引的瓶颈–》io–》平均下来就是树的高度–》红黑树的高度太高相对B+树来说太高。
- B树:数据会放在非叶子节点,树的高度因此也比B+树高。
索引类型
- 主键索引:唯一,一个表只允许有一个主键索引,并且不能为空
- 二级索引
- 唯一索引:唯一,一个表允许多个唯一索引,并且允许为空
- 普通索引
- 前缀索引
- 全文索引:检索大文本数据中的关键字的信息
索引存储结构【不同存储引擎不同】
- 聚簇索引:innodb
- 特点:数据和索引存储在一起
- 优点:不用回表,查找速度快
- 缺点:索引维护代价大
- 非聚簇索引: myisam
- 特点:数据和索引分开放
- 优点:加了主键这一层,解耦,所以维护代价低
- 缺点:多加了一层,所以查找速度慢,需要回表
- 注意:二级索引都是非聚簇索引
问题:非聚簇索引一定会回表吗?
- select age from db where age>20
- 覆盖索引,如果能从索引里找到的,就不用回表了
联合索引和覆盖索引
- 联合索引:联合索引不是一种类型,而是说用了多列索引,跟之相互匹配的还有最左匹配原则。
- 最左匹配原则:索引从左到右匹配
- 建立联合索引的几个原则:
- 最经常用的放在左边【最左匹配原则】;
- 区分度最高的放在左边 【最高离散度原则】;
- 宽度小的放在左边【最小空间原则】
- 覆盖索引:本质是一种特殊的联合索引,把select 后需要的列也加入到联合索引之中
- 优点:不用回表
创建索引的注意事项
- 1、选择合适的字段【where、order by 、join 、select —不为null的字段】
- 2、更新频繁的最好不要建立索引,维护成本高
- 3、尽可能考虑建立联合索引而不是单列索引,并且尽量考虑覆盖索引
- 优点: 空间变小、需要维护的索引数量变小
- 4、避免冗余索引—需要维护
- 5、考虑使用前缀索引代替普通索引
- 6、不能join太多表,join都是通过嵌套循环实现的。匹配次数、join buffer 缓存
索引失效的情况
- 1、联合索引
- a. 联合索引不遵循最左匹配原则
- b. 联合索引前面索引列使用了范围查询(<,>,like),这里>=不会失效
- 2、索引上做任何操作
- a. 计算
- b. 函数
- c. 隐式转换 最常见的:字符串类型不添加引号
- 3、判空,is null和is not null 都无法使用索引
- 4、使用or 索引会失效,能用in尽量用in:age =3 or age =1 ===>尽量换成 age in(3,1)
- 5、链表关联使用的字段中的长度、编码不一致会导致失效===》本质上是隐式转换
- 6、模糊查询,以%开头的like会让索引失效—》type=all,全表查询**。这里可以使用覆盖索引解决%前置失效的问题**
- 7、优化器,觉得如果使用全表扫描比使用索引快,也会导致索引失效。