https://www.bilibili.com/video/BV1iq4y1u7vj?p=115
1.为什么使用索引
索引的作用:减少磁盘I/O次数
2.索引及其优缺点
2.1 索引概述
排好序的快速查找数据结构
2.2 优点
2.3 缺点
(1)创建和维护耗时
(2)索引站磁盘空间
(3)更新表时,需要维护索引,耗时
3.InnoDB中索引的推演
https://www.bilibili.com/video/BV1iq4y1u7vj?p=116&spm_id_from=pageDriver
声明:
- 索引在具体的存储引擎中实现,不同存储引擎中 索引底层数据结构是不同的;
- 5.5之后默认使用InnoDB,所以这里讲解InnoDB的索引
3.1 索引之前的查找
先来看一个精准匹配的sql:
select 【列名列表】from 表名 where 列名 = xxx;
1.在一个页中查找
- 底层是链表结构,一个记录对应一个节点
2.在很多页中查找
- 数据页之间是双链表结构,一页为一个节点
- 一个书架就相当于一个数据页
3.2 设计索引
1.一个简单的索引设计方案(构建页目录)
数据页
数据页目录
至此,针对数据页做的简易目录就搞定了;这个目录有一个别名,就叫做索引
构建页目录总结:
- 数据页之内 以及 之间,数据必须是单调递增的
- 数据页的编号并不是连续的,通过双向链表的方式连接
- 页分裂:数据页之间必须保证数据的单调关系,因此在insert的时候导致记录在页之间移动的现象 叫做页分裂
- 数据页的目录结构: key: 数据页中最小值 value:数据页编号
- 定位记录的两次 二分查找: 在目录页中定位数据页,在数据页中定位记录
2.InnoDB中索引方案
1.迭代1次 :数据页 和 目录页
使用数据页的设计方式来设计目录页
目录页设计总结:
- 和数据页用同样的思想设计目录页
- 目录页中 记录单元是 目录项 , 其RecordType = 1
- 数据页中 记录单元是 数据项 , 其RecordType = 0
- 目录项只包含 key-value,key是对应数据页最小索引值,value是对应数据页编号
- 数据项除了字段 还有额外信息,并且字段个数是不固定的
2.迭代2次 :多目录页
3.迭代3次 :目录页的目录页
4. B+ Tree 成形!
总结:
- B+树每一个节点表示一次IO
- 树的层次越低,IO次数越少;因为每一个页是一次IO
- B+树能够存储的记录数 = 数据页可存记录数 * 目录页可存记录数 ^ (层数 - 1)
3.3 常见索引概念
https://www.bilibili.com/video/BV1iq4y1u7vj?p=118&spm_id_from=pageDriver
1.聚簇索引(☆☆☆☆☆)
定义
- 聚簇索引 指的是一种数据存储方式:用户记录完整的存储在B+ Tree的叶子节点 ;
- 反应在InnoDB存储引擎中,
.idb
文件既有数据也有索引,二者存储在一起,所以是聚簇索引,MyISAM 是将索引和数据分成两个文件存储,所以是非聚簇索引
B+ Tree 聚簇索引
2.二级索引(辅助索引、非聚簇索引)
二级索引结构
3. 二级索引的回表查询
二级索引的叶子节点的数据项 只存储 : 建立索引的列 + 主键
3.联合索引
- 索引的存储方式只分为聚簇索引和非聚簇索引;
- 联合索引指的是用多个字段联合作为索引key,因此若不是联合主键,联合索引就是非聚簇索引;
3.4 InnoDB的B+树索引注意事项
1.根页面万年不动
2.内节点目录项唯一性
二级索引的索引 key 其实是非主键+主键
3.一个页面最少有两个记录
4. MyISAM的索引方案
4.1 MyISAM索引原理
4.2 MyISAM和InnoDB对比
5. 索引的代价
6.Mysql数据结构选择的合理性
6.1 全表遍历
6.2 Hash结构
6.3 二叉搜索树
6.4 AVL树
6.5 B-Tree
6.6 B+Tree