MySQL学习之索引

什么是索引

索引的出现是为了提高查询效率,就像书的目录一样,但是实现索引的方式却有很多种,所以这里也就引入了索引模型的概念,可以用于提高读写效率的数据结构很多,这里我先给你介绍三种常见也比较简单的数据结构,它们分别是哈希表、有序数组和搜索树。

哈希表
哈希表的=中的链表并不是有序的,索引哈希索引做区间查询的速度是很慢的,哈希表这种结构适用于只有等值查询的场景

有序数组
在等值查询和范围查询场景中的性能就都非常优秀,如果仅仅看查询效率,有序数组就是最好的数据结构了。但是,在需要更新数据的时候就麻烦了,你往中间插入一个记录就必须得挪动后面所有的记录,成本太高。有序数组索引只适用于静态存储引擎

多路查找树(B+,?
传统的搜索树为二叉树,你可以想象一下一棵 100 万节点的平衡二叉树,树高 20。一次查询可能需要访问 20 个数据块。在机械硬盘时代,从磁盘随机读一个数据块需要 10 ms 左右的寻址时间。也就是说,对于一个 100 万行的表,如果使用二叉树来存储,单独访问一个行可能需要 20 个 10ms 的时间,这个查询可真够慢的。
为了让一个查询尽量少地读磁盘,就必须让查询过程访问尽量少的数据块。那么,我们就不应该使用二叉树,而是要使用“N 叉”树(多路查找树)。这里,“N 叉”树中的“N”取决于数据块的大小。

InnoDB 的索引模型

在 InnoDB 中,表都是根据主键顺序以索引的形式存放的,这种存储方式的表称为索引组
织表。又因为前面我们提到的,InnoDB 使用了 B+ 树索引模型,所以数据都是存储在 B+
树中的。

索引类型分为主键索引和非主键索引。
主键索引的叶子节点存的是整行数据。在 InnoDB 里,主键索引也被称为聚簇索引
(clustered index)。
非主键索引的叶子节点内容是主键的值。在 InnoDB 里,非主键索引也被称为二级索引
(secondary index)。

索引重建

为什么要重建索引?
索引可能会因为删除,或者页分裂等原因导致效率下降,重建索引可以把数据按顺序插入,使得页面利用率最高,并节省空间。不论是删除主键还是创建主键,都会将整个表重建。上文说了,在非主键上查询结果需要回表,进行二次查询。对于回表过程的一个优化就是建立覆盖索引。

基于主键索引和普通索引的查询有什么区别

mysql> 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),两棵树
的示例示意图如下
在这里插入图片描述

如果语句是 select * from T where ID=500,即主键查询方式,则只需要搜索 ID 这棵
B+ 树;
如果语句是 select * from T where k=5,即普通索引查询方式,则需要先搜索 k 索引
树,得到 ID 的值为 500,再到 ID 索引树搜索一次。回到主键索引树搜索的过程
,这个过程称为回表。
也就是说,基于非主键索引的查询需要多扫描一棵索引树。因此,我们在应用中应该尽量
使用主键查询。

覆盖索引

要查询的值已经在索引树上,不需要再次查询主键索引树获取数据。这种索引就叫覆盖索引。
如果执行的语句是 select ID from T where k between 3 and 5,这时只需要查 ID 的
值,而 ID 的值已经在 k 索引树上了,因此可以直接提供查询结果,不需要回表。也就是
说,在这个查询里面,索引 k 已经“覆盖了”我们的查询需求,我们称为覆盖索引。
由于覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用
的性能优化手段

联合索引

最左前缀原则

B+ 树这种索引结构,可以利用索引的“最左前缀”,来定位记录。
sql语句中字段的顺序不需要和联合索引中定义的字段顺序一致

索引下推

索引下推优化可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数

自增主键

自增主键是指自增列上定义的主键,在建表语句中一般是这么定义的: NOT NULL
PRIMARY KEY AUTO_INCREMENT。自增主键可以为NULL。
插入新记录的时候可以不指定字段的值,系统会获取当前字段的最大值加 1 作为下一条记录的
ID 值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值