首页 » 软件开发 » 数据库中的索引,原理是什么?为什么查询使用索引就会快,友情链接搜读。

数据库中的索引,原理是什么?为什么查询使用索引就会快,友情链接搜读。

少女玫瑰心 2024-09-05 16:09:31 软件开发 0

扫一扫用手机浏览

文章目录 [+]

各位网友好,小编关注的话题,就是关于友情链接索引量的问题,为大家整理了1个问题友情链接索引量的解答内容来自网络整理。

数据库中的索引,原理是什么?为什么查询使用索引就会快

索引简单来说就是一本字典的目录,数据量小的时候,字典比较薄,全部一扫而过,瞬间就能查询到你指定的数据,但是随着数据量的增加,字典越来越厚,全部扫,费时费力(消耗大量的系统内存,磁盘瞬间IO也会越来越吃紧,占用大量系统资源,进程得不到释放),这时候如果给字典新增加个对应章节(表)目录,我们直接通过目录就能快速检索到有用数据,不会漫无边际的全部扫,再去过滤。当然由于你新建了目录(索引),肯定会占用一定的字典空间,当然针对你的查询来说,通过空间换时间,这个还是很值得的。针对插入,由于你需要往指定目录(有索引的表)插入数据,字典(数据库系统)需要重新更新制定目录并且维护目录信息,因此插入这个过程会慢,如何解决这一问题呢,我们可以删除指定目录(索引或者分区),数据全部处理好以后重新创建目录。

数据库索引可以理解成图书馆的书架,书架按书目分类,或者理解成一本书的目录。想想如果没有这些目录,要找一本书中内容,就要从头把书翻一遍,或者把图书馆的书都找一遍,这样会有多慢?

数据库中的索引,原理是什么?为什么查询使用索引就会快,友情链接搜读。 数据库中的索引,原理是什么?为什么查询使用索引就会快,友情链接搜读。 软件开发
(图片来自网络侵删)

数据库建立索引也是这个原理,数据有了分类目录了,查询数据的时候,先查找目录就会快了很多。

不过对现在的海量数据来讲,有了索引还是杯水车薪,查询依然很慢,而且建立索引要占用额外的存储空间,对数据库来讲存贮空间是非常值钱的,商业数据库存贮空间收费昂贵。

数据库中的索引,原理是什么?为什么查询使用索引就会快,友情链接搜读。 数据库中的索引,原理是什么?为什么查询使用索引就会快,友情链接搜读。 软件开发
(图片来自网络侵删)

真正的海量数据存贮,查询效率都是用计算机硬件堆起来的,就是用钱堆起来的,不要想在软件上做点优化就会有多少本质的提高。

具体硬件优化有很多手段,前端查询,数据库缓存,分布式应用等等,要想掌握好数据库的优化,去看看实际的商业应用案例最好,书本上的那些东西,没多大意义。

相信很多程序员朋友对数据的索引并不陌生,最常见的索引是 B+ Tree 索引,索引可以加快数据库的检索速度,但是会降低新增、修改、删除操作的速度,一些错误的写法会导致索引失效等等。

但是如果被问到,为什么用了索引之后,查询就会变快?B+ Tree 索引的原理是什么?这时候很多人可能就不知道了,今天我就以 MySQL 的 InnoDB 引擎为例,讲一讲 B+ Tree 索引的原理。

索引的基础知识

MySQL 的基本存储结构是页,大概就是这个样子的:

在这里,我们需要了解以下几点(非常重要):

  • 当我们用 MySQL 的 InnoDB 引擎创建表,有且只能有一个主键;如果我们没有显示地指定之间,那么MySQL 会自动生成一个隐含字段作为主键;

  • 聚集索引:以主键创建的索引;聚集索引的叶子节点存储的是表中的数据;

  • 非聚集索引:非主键创建的索引;非聚集索引在叶子节点存储的是主键和索引列;使用非聚集索引查询数据,会查询到叶子上的主键,再根据主键查到数据(这个过程叫做回表)。

页和页之间、页和数据之间的关系

我们以聚集索引做讲解,页和页之间、以及页和数据之间的关系是这样的:

  • 数据页和数据页之间,组成一个双向链表;

  • 每个数据页中的记录,是一个单向链表;

  • 每个数据页都根据内部的记录生成一个页目录(Page directory),如果是主键的话,可以在页目录中使用二分法快速定位;

  • 如果我们根据一个非主键、非索引列进行查询,那么需要遍历双向链表,找到所在的页;再遍历页内的单向链表;如果表内数据很大的话,这样的查询就会很慢。

B+ Tree 索引的原理

先让我们看看 B+ Tree 索引大概是什么样子(以聚集/主键索引为例):

  • 假如这时候我们要查询 id = 16 的数据:

  • 查询页-1,找到页-2 存储的是小于 30 的数据;

  • 查询页-2,找到页-5 存储的是 10~20 的数据;

  • 查询页-5,找到 id = 16 的数据。

很显然,没有用索引的时候,需要遍历双向链表来定位对应的页,而有了索引,则可以通过一层层“目录”定位到对应的页上。

为什么 B+ Tree 索引会降低新增、修改、删除的>速率/strong>

  • B+ Tree 是一颗平衡树,如果对这颗树新增、修改、删除的话,会破坏它的原有结构;

  • 我们在做数据新增、修改、删除的时候,需要花额外的时间去维护索引;

  • 正因为这些额外的开销,导致索引会降低新增、修改、删除的速度。

思考题,欢迎留言讨论

现在你是否理解了 B+ Tree 索引的原理?

最后再留一个思考题:为什么官方建议使用自增长主键作为索引?大家可以在留言中写下你的答案。

我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注;关注我后,可私信发送数字【1】,获取海量学习资料。

索引是存储引擎用于快速查找记录的数据结构,MySQL 数据库内部索引是由不同的引擎实现的,主要说一下最常用的InnoDB引擎中的索引,InnoDB引擎中的索引是使用B+ 树的结构来存储的,B+ 树结构如下图:

先来说一下B+ 树的特点:

  • 叶子节点(最下面一层)存储关键字(索引字段的值)信息及对应的全部数据记录。

  • 非叶子节点只存储关键字的信息及子节点的指针

  • 每个叶子节点相当于MySQL中的一个数据页,同层级的叶子节点以双向链表的形式连接。

  • 每个节点中存储了多条记录,记录之间用单链表的形式连接组成了一条有序的链表。

  • 在 B+ 树中检索数据时:每次检索都从根节点开始,一直搜索到叶子节点。

InnoDB 的数据是按数据页为单位来读写的。也就是说,当需要读取一条记录的时候,并不是将这个记录本身从磁盘读取出来,而是以页为单位,将整个也加载到内存中,一个页中可能有很多记录,然后在内存中对页通过二分法进行检索。在InnoDB 中,每个页的大小默认是16kb。

总体来说,MySQL中的索引用到了B+树、链表、二分法,实现了快速查找数据。



MySQL索引>范例/strong>

InnoDB 中有两种索引>范例strong>:主键索引与辅助索引

  • 主键索引(聚集索引):每个表只有一个主键索引,叶子节点同时保存了主键的值以及对应的全部记录。

  • 辅助索引(非聚集索引):叶子节点保存了索引字段的值以及主键的值。

我们以上图中Person表 为例,其中id 是主键,name 是辅助索引,接下里我们来看一下InnoDB引擎中数据检索过程:

  • 若需要查询 id=1 的数据,只需要使用主键索引中检索就可以查询到数据。(红色线)

  • 若需要搜索 name='Jacy' 的数据,需要使用非聚集索引与聚集索引,需要2步(蓝色线):

  1. 先通过辅助索引中检索 name='Jacy'的数据,获取 id 的值。

  2. 再通过id值 到主键索引中 检索id=12的数据。


接下来,我们再看下以下查询的数据检索过程。

主键索引(或唯一索引)查询

上图中所有的数据都是唯一的,我们查询26的记录,过程如下:

  • 首先把page1 页加载到内存中通过二分法查找。

  • 确定26位于[20,40)中间,然后加载20所关联的page3 页.

  • page3 页加载到内存中,采用二分法找到26的记录后退出。


非唯一索引查询

上图中查询26的所有记录,数据不唯一,过程如下:

  • page1 页加载到内存中通过二分法查找。

  • 确定26位于[20,40)中间,然后加载20所关联的page3 页。

  • 将page3 页加载到内存中通过二分法找到最后一个小于26的记录是23,然后通过链表从23开始向后访问,找到所有的26记录,直到遇到第一个大于26的值退出。


模糊查询

上图中查询以 b字母开头的所有记录,过程如下:

  • 将page1页加载到内存中,通过二分法查找最后一个小于等于b的值(b),和第一个大于b的(z),b指向叶节点page3,z指向叶节点page5

  • 如此一来,可以确定以 b 开头的记录存在于[page3,page5) 这个范围内。

  • 最后依次加载page3 到内存中,通过二分法找到第一条b开头的记录,然后以链表方式继续向后访问page4 中的记录,直至遇到一个字母为z的值退出。

如果查询包含b的记录,是如何执行的呢?

当我们使用 '%b%' 全模糊查询时,通过索引我们还可以快速定位所在的页嘛?

如上图包含b字母的数据在每个页中都存在,因此无法判断包含 b 的记录在哪些页中,只能通过IO的方式加载所有页,遍历所有记录进行过滤,才可以找到包含b的记录。因此使用LIKE %b%进行全模糊查询时,索引是无效的。

更多内容可以浏览《MySQL数据库中如何正确的理解与使用索引》https://www.toutiao.com/i6759910720944472588/

到此,大家对友情链接索引量的解答时否满意,希望友情链接索引量的1解答对大家有用,如内容不符合请联系小编修改。

标签:

相关文章