常见索引模型
哈希表:
数组+链表,hash算法取得index,若冲突则链表。
适用于:只有等值查询的场景有序数组:
数组,查询方便,修改记录成本较高
适用于:静态存储引擎搜索树
平衡N叉树
InnoDB索引模型
B+树,减少单次查询的磁盘访问数。
设有如下建表语句
create table T(
id int primary key,
k int not null,
name varchar(16),
index (k)
)engine=InnoDB;
表中R1~R5的(ID,k)值分别为(100,1)、(200,2)、(300,3)、(500,5)和(600,6),两棵树的示例示意
图如下。
InnoDB的索引组织结构
主键索引(聚簇索引):叶节点为整行数据
非主键索引(二级索引):叶节点为主键值
基于两者查询的区别:
- 基于主键:只搜索ID的B+树。
- 基于非主键索引:先搜索对应索引树获得主键,再根据结果搜索主键索引树。
索引维护
维护有序性,可能导致以下操作:
页分裂:影响性能,影响空间利用率
页合并:对利用率低的数据也页进行合并
自增主键:性能、存储空间最优
- 性能:保证插入新数据时都是追加操作,不涉及其他记录的移动,也不涉及叶节点分裂
- 存储空间:主键长度小,普通索引占用空间就小
业务逻辑字段主键:(KV场景)
- 只有一个索引
- 该索引必须是唯一索引
重建索引:
非主键索引:
alter table T drop index k;
alter table T add index(k);
主键索引:
alter table T engine=InnoDB