这里写目录标题
- 1.索引前述
- 2.hash索引
- 3.自适应hash索引
- 4.平衡二叉树
- 5.B--Tree索引
- 6.B+Tree
- 7.覆盖索引
- 8.联合索引
- 9.索引下推
- Myisam引擎索引
- InnoDB引擎索引
1.索引前述
1.什么是sql索引?
索引是一种数据结构,存储在硬盘中。是一种利用空间资源换取时间资源的数据结构。从资源的角度上来说,一个好的索引,可以让较小的空间资源换取较大的时间资源。
特点:hash值会放入内存中、数据量大可能造成内存不够的情况;hash值对应的是一整行的数据,无法找到需要特定的列;范围查询(大于、小于、排序等)无效;hash碰撞(一个hash值可能有多行数据)。
所以,当范围查找,或查找特定的列的数据时,需关掉hash索引
2.hash索引
2.hash索引
建立hash索引的列,会计算其hash索引的hashcode,hash表中按顺序存储hash值以及hash值对应的行指针。按hash值得顺序大小来查找数据。
3.自适应hash索引
3.自适应hash索引
系统自己判断建立hash索引,用户无法更改
memory存储引擎是存储在内存中的,支持手动更改hash索引,一般用作中间表;
4.平衡二叉树
4.平衡二叉树
右边的数总比左边的数大,高度差不超过一,每一个节点只有一个关键字,最多只有两路,节点引用指针
5.B–Tree索引
5.B–Tree索引
B–Tree又叫多叉平衡查找树或是多路搜索树;
特点:每个节点多关键字,节点引用指针,多数据区,多路树,没有高度差,右边的数总比左边的数大,根据关键字分成全是开区间,IO操作包含关键字+数据区+指针
6.B+Tree
6.B+Tree
每个节点多关键字,节点引用指针,多路树,关键字和路数为1:1,根据关键字分成左闭右开区间,没有高度差,右边的数总比左边的数大,数据区在叶子节点,数据区(即叶子节点)的数据按从小到大顺序排列,每个尾节点指向下一个头节点,每次IO操作只有关键字+指针
7.覆盖索引
7.覆盖索引
查询结果是联合索引中的字段或是主键字段,查询条件是普通索引或是主键索引又或是联合索引的最左原则字段无需回表(I/O)操作。常用于优化sql
例1:user表中的主键索引id
select id from user where id=5;
列2:user表中的普通索引name,
增加一个联合索引:alert table user add index id_name (id,name);
select name from user where id = 5;
8.联合索引
8.联合索引
联合索引遵循最左原则;where条件以最左字段开始搜索。
如(id,name)联合索引时,id=1与di=1 and name = 小明 这两个条件都走索引,单name = 小明为条件时,不走索引
9.索引下推
9.索引下推
多个索引作为查询条件,会过滤掉其他索引的条件,以减少回表次数
例如:(id,name)联合索引时,
select * from where like '张%' and age = 20;
此语句要进行回表操作
MySQL 5.6引入了索引下推优化,会先过滤掉年龄age不等于20的数据,以减少回表操作的频率。
Myisam引擎索引
Myisam引擎索引
Myisam引擎的 主键索引与非主键索引,均是通过查找索引的.myi文件,根据索引找到具体的磁盘指针位置,再去.myd文件中找到磁盘指针所指向的数据。
Myisam引擎的主键索引与非主键索引都是非聚簇索引,都需要二次查找
InnoDB引擎索引
InnoDB引擎索引
InnoDB引擎的索引是B+Tree索引
InnoDB引擎的主键(聚簇)索引会从.ibd文件中查找,其.ibd文件中的数据区会挂载该主键索引的行记录信息,然后直接返回。
InnoDB引擎的非主键(非聚簇)索引会从.ibd文件中查找,其.ibd文件中的数据区会挂载该主键值,再根据主键值去找主键对应的行记录
如若不手动建立主键(聚集)索引 主键索引一般是int类型占用4byte,InnoDB会帮我们建立_rowid的隐藏主键索引,行记录会挂载该索引下,int类型但占用6byte,还有行锁会升级为表锁。
说明:有些术语有可能描述不准确,仅供个人学习使用