前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >用新华字典来彻底解释清:数据库索引到底是什么

用新华字典来彻底解释清:数据库索引到底是什么

作者头像
帅地
发布于 2020-02-21 07:31:19
发布于 2020-02-21 07:31:19
8040
举报
文章被收录于专栏:苦逼的码农苦逼的码农

作者:兜里有辣条

来源:segmentfault.com/a/1190000018153249

说在前面

数据库超级重要,这个大家应该清楚,学过数据库的朋友一定知道,数据库在使用时,即使没有加索引也可以运行,但是所有学习数据库的资料、教程,一定会有大量的篇幅在介绍数据库索引,各种后端开发工作的面试也一定绕不开索引,甚至可以说数据库索引是从后端初级开发跨越到高级开发的屠龙宝刀,那么索引到底在服务端程序中起着怎样的作用呢?


到底什么是索引?

用一句话来描述:数据库索引就是一种加快海量数据查询的关键技术。现在还不理解这句话?不要紧,往下看,20分钟以后你就能自己做出这样的总结来了。

首先给大家看一张图片

这本书大家一定都很熟悉,小学入门第一课一定就是教小朋友们学习如何使用这本书。那这和我们的数据库索引有啥关系呢?别着急,我们翻开第一页看看。

注意右上角的那一排文字,其实目录就是传说中的索引!从前面的“一句话描述”我们可以知道,索引的目的就是为了加快数据查询。那么我们查字典时翻的第一个地方是哪里呢,我相信大部分人都会先翻到拼音目录,毕竟现在很多人都是提笔忘字了?。

数据库索引的作用和拼音目录是一样的,就是最快速的锁定目标数据所在的位置范围。比如我们在这里要查 这个字,那么我们找到了Xx部分之后就能按顺序找到xian这个拼音所在的页码,根据前后的页码我们可以知道这个字一定是在519页到523页之间的,范围一下子就缩小到只有4页了。这相比我们从头翻到尾可是快多了,这时候就出现了第一个专业术语——全表扫描,也就是我们说的从头找到尾了。

果然,我们在第521页找到了我们要找的“险”字。

那么现在我们就知道数据库索引大概是一个什么东西了:数据库索引是一个类似于目录这样的用来加快数据查询的技术。


什么是联合索引?

相信大家都见过一些包含多个字段的数据库索引,比如 INDEX idx_test(col_a,col_b)。这种包含多个字段的索引就被称为“联合索引”。那么在多个字段上建索引能起到什么样的作用呢?下面还是以新华字典为例,来看看到底什么是联合索引。

新华字典里还有一种目录被称为“部首目录”,下面可以看到,要使用这个目录我们首先会根据部首的笔画数找到对应该能的部分,然后可以在里面找到我们想找的部首。比如如果我们还是要找 字所在的位置:

找到部首后,右边的页码还不是 字真正的页码,我们还需要根据右边的页码找到对应部首在检字表中的位置。找到第93页的检字表后我们就可以根据 余下的笔画数(7画)在“6-8画”这一部分里找到 字真正的页码了。

在这个过程中,我们按顺序使用了“两个目录”,一个叫做“部首目录”,一个叫做“检字表”。并且我们可以看到上图中检字表的内容都是按部首分门别类组织的。这两个部分合在一起就是我们在本节讨论的主题——联合索引。即通过第一个字段的值(部首)在第一级索引中找到对应的第二级索引位置(检字表页码),然后在第二级索引中根据第二个字段的值(笔画)找到符合条件的数据所在的位置(险字的真正页码)。


最左前缀匹配

从前面使用部首目录的例子中可以看出,如果我们不知道一个字的部首是什么的话,那基本是没办法使用这个目录的。这说明仅仅通过笔画数(第二个字段)是没办法使用部首目录的。

这就引申出了联合索引的一个规则:联合索引中的字段,只有某个字段(笔画)左边的所有字段(部首)都被使用了,才能使用该字段上的索引。例如,有索引 INDEX idx_i1(col_a,col_b),如果查询条件为 wherecol_b =1,则无法使用索引 idx_i1

但是如果我们知道部首但是不知道笔画数,比如不知道“横折竖弯勾”是算一笔还是两笔,那我们仍然可以使用“部首目录”部分的内容,只是要把“检字表”对应部首里的所有字都看一遍就能找到我们要找的字了。

这就引申出了联合索引的另一个规则:联合索引中的字段,即使某个字段(部首)右边的其他字段(笔画)没有被使用,该字段之前(含)的所有字段仍然可以正常使用索引。例如,有索引 INDEX idx_i2(col_a,col_b,col_c),则查询条件 wherecol_a =1andcol_b =2在字段 col_acol_b上仍然可以走索引。

但是,如果我们在确定部首后,不知道一个字到底是两画还是三画,这种情况下我们只需要在对应部首的两画和三画部分中找就可以了,也就是说我们仍然使用了检字表中的内容。所以,使用范围条件查询时也是可以使用索引的。

最后,我们可以完整地表述一下最左前缀匹配原则的含义:对于一个联合索引,如果有一个SQL查询语句需要执行,则只有从索引最左边的第一个字段开始到SQL语句查询条件中不包含的字段(不含)或范围条件字段(含)为止的部分才会使用索引进行加速。


什么是聚集索引?

从上文的部首目录和拼音目录同时存在但是实际的字典内容只有一份这一点上可以看出,在数据库中一张表上是可以有多个索引的。那么不同的索引之间有什么区别呢?

我们在新华字典的侧面可以看到一个V字形的一个个黑色小方块,有很多人都会在侧面写上 A, B, C, D这样对应的拼音字母。因为字典中所有的字都是按照拼音顺序排列的,有时候直接使用首字母翻开对应的部分查也很快。

像拼音目录这样的索引,数据会根据索引中的顺序进行排列和组织的,这样的索引就被称为聚集索引,而非聚集索引就是其他的一般索引。因为数据只能按照一种规则排序,所以一张表至多有一个聚集索引,但可以有多个非聚集索引。

MySQL数据库的 InnoDB存储引擎中,主键索引就是聚集索引,所有数据都会按照主键索引进行组织;而在MyISAM存储引擎中,就没有聚集索引了,因为MyISAM存储引擎中的数据不是按索引顺序进行存储的。

好了,到此为止,关于非常重要的数据库索引的概念应该非常清楚了,对吧。后面继续再出实战和优化方面的文章

我整理了几百本CS相关的电子书,全部都放在了这个Github:https://github.com/iamshuaidi/CS-Book(点击阅读原文直达,电脑打开更佳)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 帅地玩编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
数据库索引
索引就是加快检索表中数据的方法。数据库的索引类似于书籍的索引。在书籍中,索引允许用户不必翻阅完整个书就能迅速地找到所需要的信息。在数据库中,索引也允许数据库程序迅速地找到表中的数据,而不必扫描整个数据库。
Kevin_Zhang
2018/09/20
1.1K0
数据库索引
聚合索引(clustered index) / 非聚合索引(nonclustered index)
以下我面试经常问的2道题..尤其针对觉得自己SQL SERVER 还不错的同志.. 呵呵 很难有人答得好.. 各位在我收集每个人擅长的东西时,大部分都把SQL SERVER 标为Expert,看看是
欢醉
2018/01/22
8.1K0
python技术面试题(十四)--数据库索引
You raise me up,so I can stand on mountains .You raise me up,to walk on stormy seas.
小闫同学啊
2019/07/18
4910
python技术面试题(十四)--数据库索引
Mysql索引知识详谈
原文地址:https://www.t-io.org/1159984867644153856
talent-tan
2019/08/10
3270
手把手学会Elasticsearch(一)
看到标题,相信大家肯定都不陌生,Elasticsearch,现在很多公司在使用的,也是很多公司在面试的时候很喜欢问的一些题目,而今天阿粉也想着出几篇教程,然后手把手的把ES这块的内容给大家展现出来,让大家都能够系统的学习一下。
Java极客技术
2022/12/04
3530
手把手学会Elasticsearch(一)
《逆袭进大厂》第十二弹之MySQL重点篇27问27答
我来更新了,本期是 MySQL 第二期,至此 MySQL 部分就全部更新完毕了,下一弹就是 Redis 篇了。
拓跋阿秀
2021/04/28
6810
深入拆解'搜索引擎'实现原理一:初识 '搜索引擎'
对结构化数据的搜索:也就是我们平时用的最多的,对数据库的SQL搜索,名称、状态、创建时间等
浩说编程
2021/09/10
7850
sql sever 索引
微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)
week
2018/08/27
4990
数据库进阶2 Mysql高并发优化
如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能。所以,在一个系统开始实施之前,完备的数据库模型的设计是必须的。
范蠡
2018/07/25
2K0
分布式搜索引擎面试题(一)
Lucene是一套用于全文检索和搜索的开放源代码程序库。实际上lucene的功能很单一,说到底,就是你给它若干个字符串,然后它为你提供一个全文搜索服务,告诉你你要搜索的关键词出现在哪里。
码农小胖哥
2019/12/10
1.1K0
MySQL与InnoDB(下)-B+树与索引
本文主要介绍了MySQL与InnoDB存储引擎中的索引机制,包括聚集索引、非聚集索引、B+树索引和索引查找算法等。聚集索引是一种基于B+树的索引,将每张表的数据存储顺序与索引顺序对应,以最大程度地提高查找效率。非聚集索引则将索引字段值与数据行存储在一起,每个叶子节点存储一个键值对。B+树是一种平衡树,每个节点包含关键字和指针,并且叶子节点包含数据行。索引查找算法主要包括顺序查找、二分查找、二叉树查找等,每种算法都有其优缺点和适用场景。
企鹅号小编
2018/01/02
9560
MySQL与InnoDB(下)-B+树与索引
漫谈数据库索引
一、引言 对数据库索引的关注从未淡出我的们的讨论,那么数据库索引是什么样的?聚集索引与非聚集索引有什么不同?希望本文对各位同仁有一定的帮助。有不少存疑的地方,诚心希望各位不吝赐教指正,共同进步。 二、B-Tree 我们常见的数据库系统,其索引使用的数据结构多是B-Tree或者B+Tree。例如,MsSql使用的是B+Tree,Oracle及Sysbase使用的是B-Tree。所以在最开始,简单地介绍一下B-Tree。 B-Tree不同于Binary Tree(二叉树,最多有两个子树),一棵M阶的B-Tr
java达人
2018/01/31
9300
漫谈数据库索引
数据库事务和索引
事务的性质:   原子性:同一个事务中的所有操作要不然全部成功要不然全部失败   一致性:一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,,也就是说一个事务执行之前和执行之后都必须处
李家酒馆酒保
2017/12/28
6070
快速学习Lucene-什么是全文检索
结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等。 非结构化数据:指不定长或无固定格式的数据,如邮件,word文档等磁盘上的文件
cwl_java
2019/12/25
5690
深入浅出数据库索引
前段时间,公司一个新上线的网站出现页面响应速度缓慢的问题, 一位负责这个项目的但并不是搞技术的妹子找到我,让我想办法提升网站的访问速度 ,因为已经有很多用户来投诉了。我第一反应觉的是数据库上的问题,假装思索了一下,摆着一副深沉炫酷的模样说:“是不是数据库查询上出问题了, 给表加上索引吧”,然后妹子来了一句:“现在我们网站访问量太大,加索引有可能导致写入数据时性能下降,影响用户使用的”。当时我就楞了一下, 有种强行装逼被拆穿的感觉,在自己的专业领域居然被非专业的同学教育, 面子上真有点挂不住。 其实, 我说这
用户1608022
2018/04/11
7970
深入浅出数据库索引
sql-索引的作用(超详细)
实际上,您可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。下面,我们举例来说明一下聚集索引和非聚集索引的区别:
全栈程序员站长
2022/09/06
9600
全文检索原理
根据用户输入的关键词(java), 应用服务器使用SQL语句查询数据库, 将查询到的结果返回给用户.
一个会写诗的程序员
2020/07/10
2.7K0
SQL索引基础
一、深入浅出理解索引结构    实际上,您可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。下面,我们举例来说明一下聚集索引和非聚集索引的区别:    其实,我们的汉语字典的正文本身就是一个聚集索引。比如,我们要查“安”字,就会很自然地翻开字典的前几页,因为“安”的拼音是“an”,而按照拼音排序汉字的字典是以英文字母“a”开头并以“z”结尾的,那么“安”字就自然地排在字典的前部。如果您翻完了所有以“a”开头的部分仍然找不到这个字,那么就说明您的字典中没有这个字;同样的,如果查“张”字,那您也会将您的字典翻到最后部分,因为“张”的拼音是“zhang”。也就是说,字典的正文部分本身就是一个目录,您不需要再去查其他目录来找到您需要找的内容。我们把这种正文内容本身就是一种按照一定规则排列的目录称为“聚集索引”。    如果您认识某个字,您可以快速地从自动中查到这个字。但您也可能会遇到您不认识的字,不知道它的发音,这时候,您就不能按照刚才的方法找到您要查的字,而需要去根据“偏旁部首”查到您要找的字,然后根据这个字后的页码直接翻到某页来找到您要找的字。但您结合“部首目录”和“检字表”而查到的字的排序并不是真正的正文的排序方法,比如您查“张”字,我们可以看到在查部首之后的检字表中“张”的页码是672页,检字表中“张”的上面是“驰”字,但页码却是63页,“张”的下面是“弩”字,页面是390页。很显然,这些字并不是真正的分别位于“张”字的上下方,现在您看到的连续的“驰、张、弩”三字实际上就是他们在非聚集索引中的排序,是字典正文中的字在非聚集索引中的映射。我们可以通过这种方式来找到您所需要的字,但它需要两个过程,先找到目录中的结果,然后再翻到您所需要的页码。我们把这种目录纯粹是目录,正文纯粹是正文的排序方式称为“非聚集索引”。    通过以上例子,我们可以理解到什么是“聚集索引”和“非聚集索引”。进一步引申一下,我们可以很容易的理解:每个表只能有一个聚集索引,因为目录只能按照一种方法进行排序。  二、何时使用聚集索引或非聚集索引   下面的表总结了何时使用聚集索引或非聚集索引(很重要)。 动作描述使用聚集索引  使用非聚集索引 外键列 应  应 主键列 应 应 列经常被分组排序(order by) 应 应 返回某范围内的数据 应 不应 小数目的不同值 应 不应 大数目的不同值 不应 应 频繁更新的列不应  应 频繁修改索引列 不应 应 一个或极少不同值 不应 不应
javascript.shop
2019/09/04
1.2K0
数据库索引原理及优化
本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论。
Bug开发工程师
2019/05/05
6140
数据库索引原理及优化
MySQL索引的原理及使用
  上篇文章中学习了MySQL库的架构以及存储引擎,了解了基本索引(普通索引,唯一索引,主键索引),着重介绍了innerDB的存储方式以及内存模型,本篇文章和大家探讨一下MySQL库中索引的原理以及索引底层的数据结构。
会说话的丶猫
2020/08/06
9990
MySQL索引的原理及使用
相关推荐
数据库索引
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档