千山万水总是情,
问问索引行不行?
轻舟已过万重山,
有种尽管来发难。
索引是在数据库优化时的重要手段之一,今天 V 哥从索引的角度展开讲一讲索引的各个要点,希望可以通过这篇文章,帮助大家彻底搞透索引的关键点。
- 1.索引的定义与作用
- 2.索引的类型
- 3.索引原理
- 4.二分查找法
- 5.Hash结构
- 6.B+Tree 结构
- 7.聚簇索引和辅助索引
- 8.索引分析与优化
- 9.查询优化
- 10.索引的优势与劣势
1.索引的定义与作用
索引是数据库中的一种数据结构,它允许数据库管理系统(DBMS)快速检索表中的数据。索引的主要目的是提高查询效率,它通过提供一个快速查找机制来减少数据检索所需的时间。没有索引的数据库表被称为堆表,其查询效率通常较低,尤其是在处理大量数据时。
2.索引的类型
普通索引
:基本的索引类型,无特殊限制。唯一索引
:索引字段值必须唯一,允许有空值。主键索引
:特殊的唯一索引,不允许空值。复合索引
:在多个列上建立的索引。全文索引
:适用于文本数据的搜索,支持自然语言查询。
3.索引原理
- 索引是存储引擎用于快速查找记录的数据结构,存储在数据文件中。
- 索引可以加快数据检索速度,但会降低增删改操作速度。
- 索引涉及的理论知识包括二分查找法、Hash 结构和 B+Tree 结构。
当执行查询时,MySQL首先检查是否可以使用索引来加快查询速度。如果可以,MySQL会使用索引来定位数据。索引查找的过程通常如下:
初始化
:从根节点开始,根节点包含整个表的索引信息。遍历
:根据查询条件,沿着树向下遍历到相应的叶子节点。查找
:在叶子节点上进行查找,找到匹配的键值。回表(对于辅助索引)
:如果使用的是辅助索引,需要根据叶子节点中的指针回聚簇索引中查找完整的数据记录。
4. 二分查找法
二分查找法也叫作折半查找法,它是在有序数组中查找指定数据的搜索算法。它的优点是等值查询、范围查询性能优秀,缺点是更新数据、新增数据、删除数据维护成本高。
- 首先定位left和right两个指针
- 计算(left+right)/2
- 判断除2后索引位置值与目标值的大小比对
- 索引位置值大于目标值就-1,right移动;如果小于目标值就+1,left移动
举个例子,下面的有序数组有17 个值,查找的目标值是7,过程如下:
- 第一次查找
- 第二次查找
- 第三次查找
- 第四次查找
5. Hash结构
Hash底层实现是由Hash表来实现的,是根据键值 <key,value>
存储数据的结构。非常适合根据key查找value值,也就是单个key查询,或者说等值查询。其结构如下所示:
- 从上面结构可以看出,Hash索引可以方便的提供等值查询,但是对于范围查询就需要全表扫描了。
- Hash索引在MySQL 中Hash结构主要应用在Memory原生的Hash索引 、InnoDB 自适应哈希索引。
- InnoDB提供的自适应哈希索引功能强大,接下来重点描述下InnoDB 自适应哈希索引。
- InnoDB自适应哈希索引是为了提升查询效率,InnoDB存储引擎会监控表上各个索引页的查询,当InnoDB注意到某些索引值访问非常频繁时,会在内存中基于B+Tree索引再创建一个哈希索引,使得内存中的 B+Tree 索引具备哈希索引的功能,即能够快速定值访问频繁访问的索引页。
- InnoDB自适应哈希索引:在使用Hash索引访问时,一次性查找就能定位数据,等值查询效率要优于B+Tree。
- 自适应哈希索引的建立使得InnoDB存储引擎能自动根据索引页访问的频率和模式自动地为某些热点页建立哈希索引来加速访问。另