MySQL索引解析(联合索引/最左前缀/覆盖索引/索引下推)

这篇博客详细介绍了MySQL索引的基础,包括索引类型(哈希索引、有序数组、B+树索引)及其适用场景。重点讨论了联合索引、最左前缀原则、覆盖索引和索引下推的概念,强调了这些索引优化技术在数据库查询性能提升中的作用。最后,博主提醒读者思考索引的相关问题,如数据结构、回表、字段顺序等。
摘要由CSDN通过智能技术生成

目录

  • 1. 索引基础
  • 2. 索引类型2.1 哈希索引2.2 有序数组2.3 B+树索引(InnoDB)
  • 3. 联合索引
  • 4. 最左前缀原则
  • 5. 覆盖索引
  • 6. 索引下推
  • 总结:

1. 索引基础

索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点,索引就是为了提高数据查询的效率。索引可以包含一个或多个列的值,如果索引包含多个列的值,则列的顺序也十分重要,因为MySQL只能高效地使用索引的最左前缀列

2. 索引类型

用于提高读写效率的数据结构有很多,这里先介绍常见的3种,分别是:

  1. 哈希表
  2. 有序数组
  3. 搜索树(重点)

2.1 哈希索引

哈希表是一种以键-值(key-value)的方式存储数据的结构,我们只要输入待查找的值(即key),就可以找到其对应的值(即Value)。哈希的思路很简单,把值放在数组里,用一个哈希函数把key换算成一个确定的位置,然后把value放在数组的这个位置,即idx = Hash(key)。如果出现哈希冲突,就采用拉链法解决。

因为哈希表中存放的数据不是有序的,因此不适合做区间查询,适用于只有等值查询的场景。

2.2 有序数组

有序数组在等值查询和范围查询场景中的性能都非常优秀。用二分法就可以快速找到(时间复杂度为O(logN))。但是如果要往中间插入一条数据,则必须挪动后面的所有记录,成本较高。因此,有序数组只适用于静态存储引擎,即数据表一旦建立后不再会修改。

2.3 B+树索引(InnoDB)

首先,得先好好理解什么是B+树!看单独介绍B树、B+树的文章,基于篇幅不在此赘述。简单的说,是因为使用B+树存储数据可以让一个查询尽量少的读磁盘,从而减少查询时磁盘I/O的时间。

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

假设,有这样一张表:该表主键为ID,且还有一个字段为k,并在k上有索引。

CREATE TABLE T(
    id int primary key,
    k int not null,
    index (k)
)engine=InnoDB;

表中有5条记录,分别为R1~R5,(100,1)、(200,2)、(300,3)、(500,5)和(600,6)。则在InnoDB中的索引组织结构是这样的:

根据叶子结点的内容,索引类型分为主键索引非主键索引

  • 主键索引的叶子结点存的是整条记录,主键索引也被称为聚簇索引(clustered index)
  • 非主键索引的叶子结点存的是主键的值,非主键索引也被称为二级索引(seco
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值