索引是一种储存方式
要查一张表,效率与时间复杂度
和硬盘IO
有关,索引就是为了提高效率。
- 选择搜索二叉树减少时间复杂度
- 每个节点都可以看做一张表,如果这棵树太高,硬盘IO次数过多,所以选择搜索二叉树中的B+树
只有叶子节点会储存数据,非叶子节点作为目录项存在。
每一层节点都有双向链表连接。
聚簇索引、非聚簇索引、联合索引
都是InnoDB引擎
- 聚簇索引是主键作为关键字,叶子节点包含
所有
的信息 - 非聚簇是按照
其他属性
作为关键字,叶子中包含主键
和关键字
两条 - 联合索引 根据
多个属性
作为关键字,叶子包括主键
和关键字
两条 -
总结
- 一个表只有一个聚合索引,可以有多个非聚簇索引
- 如果没有主键,聚合索引会选择唯一属性,如果都没有,系统会隐式设置长整型主键
- 主键不要太大,因为非聚簇也包含主键,尽量
自增
- 非聚簇不影响数据物理结构
- 非聚簇的数据修改快于聚簇,但查找慢于聚簇(回表的原因)
-
MyISAM引擎
- 它的索引只有一种,关键字任意属性(主键可有可无),叶子节点储存的是关键字和表项地址,这样它无论怎样都会回表,但它的回表是拿着地址去找对应表项
操作
- 创建
通过关键字升序。刚开始只有根节点A,当一个根节点中的页面不够时,会赋值一份相同的页面B,然后新建一个空白页面C,A更改为目录项,B和C来储存数据(页分裂) - 插入
如果是随机关键字插入,有可能要修改一些页内的很多内容,所以推荐自增。 - 查找
InnoDB:如果您要按照非主键属性来查找信息,会先通过非聚簇来找到对应主键,再通过聚簇索引来找到信息(回表)
代价
所以,代价是什么?
- 空间:需要空间来储存目录
- 时间:需要时间来维护目录项