前言
- 通过本篇博客的学习,我希望大家可以了解到 “索引” 是为了提高数据的查询效率。
索引的介绍
- 索引是为了提高查询数据效率的数据结构
索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足 特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
索引的作用
如下图所示:学生表 student
执行一条sql语句(查询名为郑家谋 的出生年月日)
select birthday from student where stuName='郑家谋';
在不使用索引的情况下,我们要进行全文检索。
数据是一条条查找, 和目标条件比对,直到找到为止,这样的效率无疑是比较慢的。
也是因为如此,后面推出了索引。
那么索引是怎么样的呢?
在这里我先提一下:索引是一个B+tree 类型的数据结构
在这里,暂时把B+tree看作一个平衡二叉树。我们知道 平衡二叉树的特点
- 左子结点小于根节点,根节点小于右子结点
- 左右高度相差最大相差一
在我们查询数据时,我们拿目标数据,首先比较根结点存储的数据,如果比它大,就舍弃左子结点,和右子结点比较;如果比它小,和左子节点比较。以此类推,每次都舍弃一部分,这样查询效率就高了。
但实际上B+tree 数据结构 是在平衡二叉树的基础上,不仅保留了平衡二叉树的优点,同时也弥补了平衡二叉树的缺点。这个具体在下一篇博客讲B+tree的结构时,详细叙述。
索引的特点
优势 | 劣势 |
---|---|
提高数据检索的效率,降低数据库的IO成本 | 索引列也是要占用空间的 |
通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗。 | 索引大大提高了查询效率,同时却也降低更新表的速度, 如对表进行INSERT、UPDATE、DELETE时,效率降低。 |
现在我们对索引的优势/劣势,详细的分析
优势
提高数据检索的效率,降低数据库的IO成本
理解
我们可以把我们使用的数据库图形化界面工具如datagrip 等 ,看作客户端。我们执行的每一条SQL语句,都可以看作向数据库服务器,发送请求。服务器使用IO流读取数据,如果不使用索引,就需要去读全部的内容。这样会消耗大量的IO资源。称为全表扫描(全文检索);如果使用索引,就只需要读取目标数据。降低了数据从磁盘(硬盘)读取到内存,这样读取的数据量减少
疑问:在数据库查询数据,数据是从 磁盘读取到内存(最先查到结果)存储数据的不是在硬盘上吗,不应该从硬盘上读取吗
如果大家有像我一样的疑惑,以下是我 查到资料后的理解
1 硬盘和磁盘的关系
- 磁盘包括硬盘也是可以存储数据的。在非技术上,磁盘和硬盘可以统一理解,都把它看成硬盘。在数据库中也是如此。
2 数据库查询数据的过程:
- 当数据库接收到一个查询请求时,它会首先检查所需的数据是否已经在内存(缓存)中。如果数据已经在内存中,数据库可以直接从内存中读取数据,这通常比从硬盘读取要快得多。
- 如果数据不在内存中,数据库需要从硬盘上读取数据。这个过程称为“页缺失”(page miss),数据库会从硬盘上读取数据页到内存中,然后从内存中提供给处理器。
通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗
理解
索引通常是有序的,这意味着数据已经被排序。如果查询请求需要返回排序后的结果,数据库可以直接利用索引的有序性来快速返回排序后的数据,而不需要额外的CPU资源来对数据进行排序。
劣势
索引列也是要占用空间的
理解
索引是一个数据结构,因此在硬盘中存储的不仅有数据库数据,还有索引数据。加大硬盘存储空间的占有
索引大大提高了查询效率,同时却也降低更新表的速度, 如对表进行INSERT、UPDATE、DELETE时,效率降低。
理解
虽然索引可以加快查询速度,但它们也会减慢数据的插入、更新和删除操作的速度。
原因如下
我认为索引本质上是为了查询表数据服务的,为了提高查询效率。因此当数据发生变化时(如插入、更新或删除),数据库系统不仅需要更新表中的数据,还需要更新所有相关的索引以保持数据的一致性。这个过程需要额外的时间和资源,尤其是在有大量索引或大量数据变动的情况下。
总的来说,索引是提高数据库查询效率的重要工具,但它们也带来了额外的存储和维护成本。在设计数据库时,需要根据具体的应用场景和需求来权衡是否使用索引以及该如何设计索引。
本篇博客,简单的介绍了索引,下一篇博客,详细将索引的结构