MySQL索引:
索引:
索引的目的在于提高查询效率
本质都是通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据
磁盘读取:
磁盘读取数据靠的是机械运动,每次读取数据花费的时间可以分为寻道时间,旋转延迟,传输时间三个部分
当一次IO读取时,不光是把当前磁盘地址的数据读取,而且吧相邻的数据也都读取到内存缓存区内
索引的数据结构:
树:
树状图是一种数据结构,它是由n(n>=1)个有限结点组成⼀个具有层次关系的集合。把它叫做“树”是因为它看 起来像⼀棵倒挂的树,也就是说它是根朝上,⽽叶朝下的。
它具有以下的特点:每个结点有零个或多个⼦结点;没有⽗结点的结点称为根结点;每⼀个非根结点有且只有 ⼀个⽗结点;除了根结点外,每个⼦结点可以分为多个不相交的⼦树
B+树:
B+树是通过二叉树查找,再由平衡二叉树,B数演化而来
聚集索引与辅助索引:
在数据库中,B+树的⾼度⼀般都在2~4层,这也就是说查找某⼀个键值的⾏记录时最多只需要2到4次IO,这倒 不错。因为当前⼀般的机械硬盘每秒⾄少可以做100次IO,2~4次的IO意味着查询时间只需要0.02~0.04秒。 数据库中的B+树索引可以分为聚集索引(clustered index)和辅助索引(secondary index),
聚集索引与辅助索引相同的是:不管是聚集索引还是辅助索引,其内部都是B+树的形式,即⾼度是平衡的,叶 ⼦结点存放着所有的数据。
聚集索引与辅助索引不同的是:叶⼦结点存放的是否是⼀整⾏的信息
聚集索引(clustered index):
每张表只能拥有一个聚集索引
InnoDB存储引擎表是索引组织表,即表中数据按照主键顺序存放。⽽聚集索引(clustered index) 就是按照每张表的主键构造⼀棵B+树,同时叶⼦结点存放的即为整张表的⾏记录数据,也将聚集索引的 叶⼦结点称为数据⻚。
聚集索引的这个特性决定了索引组织表中数据也是索引的⼀部分。同B+树数据结 构⼀样,每个数据⻚都通过⼀个双向链表来进⾏链接。
如果未定义主键,MySQL取第⼀个唯⼀索引(unique)⽽且只含非空列(NOT NULL)作为主键, InnoDB使⽤它作为聚簇索引。
如果没有这样的列,InnoDB就⾃⼰产⽣⼀个这样的ID值,它有六个字节,⽽且是隐藏的,使其作为聚 簇索引。
聚集索引的好处:
- 它对主键的排序查找和范围查找速度非常快,叶⼦节点的数据就是⽤户所要查询的数 据。如⽤户需要查找⼀张表,查询最后的10位⽤户信息,由于B+树索引是双向链表,所以⽤户可以快速找到最 后⼀个数据⻚,并取出10条记录
- 范围查询(range query),即如果要查找主键某⼀范围内的数据,通过叶⼦节点的上 层中间节点就可以得到⻚的范围,之后直接读取数据⻚即可
辅助索引(Secondary Index):
每张表上可以有多个辅助索引
表中除了聚集索引外其他索引都是辅助索引(Secondary Index,也称为非聚集索引),与聚集索引的区别是: 辅助索引的叶⼦节点不包含⾏记录的全部数据。
叶⼦节点除了包含键值以外,每个叶⼦节点中的索引⾏中还包含⼀个书签(bookmark)。该书签⽤来告诉 InnoDB存储引擎去哪⾥可以找到与索引相对应的⾏数据
聚集索引和非聚集索引(辅助索引)的区别:
聚集索引
1. 纪录的索引顺序与⽆⼒顺序相同 因此更适合between and和order by操作
2. 叶⼦结点直接对应数据 从中间级的索引⻚的索引⾏直接对应数据⻚
3. 每张表只能创建⼀个聚集索引
非聚集索引
1. 索引顺序和物理顺序⽆关
2. 叶⼦结点不直接指向数据⻚
3. 每张表可以有多个非聚集索引,需要更多磁盘和内容 多个索引会影响insert和update的速度
MySQL索引管理功能:
1. 索引的功能就是加速查找
2. mysql中的primary key,unique,联合唯⼀也都是索引,这些索引除了加速查找以外,还有约 束的功能
常用索引:
普通索引INDEX:加速查找
唯⼀索引:
-主键索引PRIMARY KEY:加速查找+约束(不为空、不能重复)
-唯⼀索引UNIQUE:加速查找+约束(不能重复)
联合索引:
-PRIMARY KEY(id,name):联合主键索引
-UNIQUE(id,name):联合唯⼀索引 -INDEX(id,name):联合普通索引