文章插图
作者 | Amazing10
责编 | 屠敏
头图 | CSDN 下载自视觉中国
【别再一知半解啦,索引其实就这么回事】本文为「业余码农」投稿
索引的概念基本所有人都会遇到过,就算没有了解过数据库中的索引,在生活中也不可避免的接触到 。比方说书籍的目录,字典的查询页,图书馆的科目检索等等 。其实这些都是一种索引,并且所起到的作用大同小异 。
而对于数据库而言,只不过是将索引的概念抽象出来,让建立索引的过程更为灵活而自由,从而可以在不同的场景下优化数据库的查询效率 。
索引在数据库的实际应用场景中十分普遍,数据库的优化也离不开对索引的优化 。同时,索引相关的知识也是面试高频的考点之一,是应试者理论结合现实最为直接的体现 。
因此,本文将从基础理论出发,介绍 MySQL 按照逻辑角度的索引分类和实现,通过数据结构的实现原理阐述不同结构对建立索引带来的优劣势,同时针对物理存储的方式对索引的组织特点和应用场景进行分析 。最后根据不同的应用场景尽可能的探究如何建立起高性能的索引 。文章结构如下:
文章插图
文章插图
概念
什么是索引?索引似乎并没有十分明确的定义,更多的是一种定性的描述 。简单来讲,索引就是一种将数据库中的记录按照特殊形式存储的数据结构 。通过索引,能够显著地提高数据查询的效率,从而提升服务器的性能 。
专业一点来说呢,索引是一个排好序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址 。在数据库十分庞大的时候,索引可以大大加快查询的速度,这是因为使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据 。
说起索引,其实并不是 MySQL 数据库特有的机制,在关系型数据库中都会有类似不同的实现 。这里我们也只是讨论 MySQL 数据库中的索引实现 。
事实上,说是 MySQL 的索引其实并不准确 。因为在 MySQL 中,索引是在存储引擎层而不是服务器层实现的 。这意味着我们所讨论的索引准确来说是 InnoDB 引擎或 MyISAM 引擎或其它存储引擎所实现的 。
所以索引即便是在 MySQL 中也没有统一的标准,不同存储引擎的所实现的索引工作方式也并不一样 。不是所有的存储引擎都支持相同类型的索引,即便是多个引擎支持同一种类型的索引,其底层的实现也可能不同 。
为什么需要索引说了这么多,索引似乎就是给数据库添加了一个「目录页」,能够方便查询数据 。但是索引的作用就仅此而已了吗,为什么需要大费周章的建立并优化索引?
说个题外话,我其实查字典从来都不喜欢查目录页,无论是查中文还是英文 。因为觉得那样很慢,一个个找索引,效率很低 。我习惯用的方式就是直接翻开字典,根据翻开的位置进行前后调整 。比方说我想找「酱 JIANG」字,会先随机翻到一页,可能是「F」开头,在「J」前面,就往后翻一点;如果随机翻到「L」,那就往前翻一点 。重复直至找到 。
这大概就是类似于二分查找的方式,看起来好像是摆脱了索引的束缚,并且也能够获得比较高的查询效率 。但是其实转念一想,在计算机的运行处理中,「一个个找索引」这个过程其实非常快,不能跟我们手动比对偏旁部首的效率相提并论 。同时,为什么我可以直接翻开字典根据字母进行调整呢,这其实不就是因为我的脑子里存在一个大概的「索引表」,知道每个字母大概对应于字典的哪一个位置 。虽然是模糊的,但却是真实存在的 。(好不容易强行解释了一波...)
如此一来,可以看出索引的一大好处是如其概念中所提及的,使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据 。这样的方式自然减少了服务器在响应时所需要对数据库扫描的数据量 。
不仅如此,在执行数据库的范围查询时,若不使用索引,那么MySQL会先扫描数据库的所有行数据并从中筛选出目标范围内的行记录,将这些行记录进行排序并生成一张临时表,然后通过临时表返回用户查询的目标行记录 。这个过程会涉及到临时表的建立和行记录的排序,当目标行记录较多的时候,会大大影响范围查询的效率 。
推荐阅读
- 发型|发型别再一成不变了,新发型15款送给你,很多女性剪完都很美
- 养老保险跨省市转移速戳这里,太方便啦!
- 炒木耳时“噼里啪啦”爆?教你这一招,不炸锅不溅油,清脆又爽口
- 呼啦圈使用重的好还是轻的好呢
- 转呼拉圈的好处和坏处
- 38元和68元的瓷砖有区别吗?内行人:价格≠价值,别再人傻钱多了
- 内测|听说,《非一般职场》手游内测要开始啦(?ω<)
- 大悟乌桕红叶观赏期来临,一年中最美的季节又到啦
- 汽车有必要做大保养吗?别再被套路了,不该换的就一定不要换
- 公积金喊你来体验 首批自助机上线啦