百摩网
当前位置: 首页 生活百科

在mysql中什么索引不是索引类(MySql索引什么是索引呢)

时间:2023-07-08 作者: 小编 阅读量: 1 栏目名: 生活百科

数据库索引对于程序开发人员都不陌生。不可避免地,多个key值经过哈希函数的换算,会出现同一个值的情况。所以,哈希表这种结构适用于只有等值查询的场景,比如redis及其他一些NoSQL引擎。并且这个索引结构还支持范围查询。二叉树是搜索效率最高的,但是实际上大多数的数据库存储却并不使用二叉树。一次查询可能需要访问20个数据块。N叉树由于在读写上的性能优点,以及适配磁盘的访问模式,已经被广泛应用在数据库引擎中了。

数据库索引对于程序开发人员都不陌生。开发系统时,都会使用各种各种的SQL语句,最多的就是查询语句,为了提高系统的响应速度或者从数据库查询数据更快,都会寻找查询比较慢的SQL查询,分析完原因之后,就会在数据表中加上索引。那什么是索引呢?

简单说索引就像书的目录一样。一本1000页的书,如果你想快速找到其中的某一个知识点,在不借助目录的情况下,那我估计你可得找一会儿。同样,对于数据库的表而言,索引其实就是它的“目录”。

索引的出现其实就是为了提高数据查询的效率。

一:索引的常见模型

索引的出现是为了提高查询效率,但是实现索引的方式却有很多种,所以这里也就引入了索引模型的概念。可以用于提高读写效率的数据结构很多,这里我先给你介绍三种常见、也比较简单的数据结构,它们分别是哈希表、有序数组和搜索树。

哈希表、有序数组和搜索树这三种模型的区别

哈希表是一种以键-值(key-value)存储数据的结构,我们只要输入待查找的值即key,就可以找到其对应的值即Value。哈希的思路很简单,把值放在数组里,用一个哈希函数把key换算成一个确定的位置,然后把value放在数组的这个位置。

不可避免地,多个key值经过哈希函数的换算,会出现同一个值的情况。处理这种情况的一种方法是,拉出一个链表。

假设,你现在维护着一个身份证和姓名的表,需要根据身份证号查找对应的名字,这时对应的哈希索引的示意图如下所示:

哈希表示意图

图中,User2和User4根据身份证号算出来的值都是N,但没关系,后面还跟了一个链表。假设,这时候你要查ID_card_n2对应的名字是什么?

  1. 将ID_card_n2通过哈希函数算出N;
  2. 按顺序遍历,找到User2。

在看图中4个ID_card_n的值并不是递增的,为什么要这样做呢?

好处:增加新的User时速度会很快,只需要往后追加。

缺点:因为不是有序的,所以哈希索引做区间查询的速度是很慢的。

如果你要区间查询,例如找身份证号在[ID_card_X,ID_card_Y]这个区间的所有用户,就必须全部扫描一遍了。

所以,哈希表这种结构适用于只有等值查询的场景,比如redis及其他一些NoSQL引擎。

有序数组在等值查询和范围查询场景中的性能就都非常优秀。还是上面这个根据身份证号查名字的例子,如果我们使用有序数组来实现的话,示意图如下所示:

有序数组示意图

我们假设身份证号没有重复,这个数组就是按照身份证号递增的顺序保存的。这时候如果你要查ID_card_n2对应的名字,用二分法查找算法可以快速定位,这个时间复杂度是O(log(N))。

并且这个索引结构还支持范围查询。你要查身份证号在[ID_card_X, ID_card_Y]区间的User,可以先用二分法查找算法找到ID_card_X(如果不存在ID_card_X,就找到大于ID_card_X的第一个User),然后向右遍历,直到查到第一个大于ID_card_Y的身份证号,退出循环。

如果仅仅看查询效率,有序数组就是最好的数据结构了。但是在更新数据的时候就麻烦了,你往中间插入一个记录就必须得挪动后面所有的记录,成本太高。

所以,有序数组索引只适用于静态存储引擎,比如你要保存的是2018年某个城市的所有人口信息,这类不会再修改的数据。

二叉搜索树也是最经典数据结构了,还是上面根据身份证号查名字的例子,如果我们用二叉搜索树来实现的话,示意图如下所示:

二叉搜索树示意图

二叉搜索树的特点:每个节点的左儿子小于父节点,父节点又小于右儿子。这样如果你要查ID_card_n2的话,按照图中的搜索顺序就是按照UserA -> UserC -> UserF -> User2这个路径得到。这个时间复杂度是O(log(N))。

二叉树搜索算法

当然为了维持O(log(N))的查询复杂度,你就需要保持这棵树是平衡二叉树。为了做这个保证,更新的时间复杂度也是O(log(N))。

树可以有二叉,也可以有多叉。多叉树就是每个节点有多个儿子,儿子之间的大小保证从左到右递增。二叉树是搜索效率最高的,但是实际上大多数的数据库存储却并不使用二叉树。其原因是,索引不止存在内存中,还要写到磁盘上。

你可以想象一下一棵100万节点的平衡二叉树,树高20。一次查询可能需要访问20个数据块。在机械硬盘时代,从磁盘随机读一个数据块需要10 ms左右的寻址时间。也就是说,对于一个100万行的表,如果使用二叉树来存储,单独访问一个行可能需要20个10 ms的时间,这个查询可真够慢的。

为了让查询过程尽量少的读磁盘,就必须让查询过程访问尽量少的数据块。那么,我们就不应该使用二叉树,而是要使用“N叉”树。这里,“N叉”树中的“N”取决于数据块的大小。

以InnoDB的一个整数字段索引为例,这个N差不多是1200。这棵树高是4的时候,就可以存1200的3次方个值,这已经17亿了。考虑到树根的数据块总是在内存中的,一个10亿行的表上一个整数字段的索引,查找一个值最多只需要访问3次磁盘。其实,树的第二层也有很大概率在内存中,那么平均访问磁盘的次数就更少了。

N叉树由于在读写上的性能优点,以及适配磁盘的访问模式,已经被广泛应用在数据库引擎中了。

不管是哈希还是有序数组,或者N叉树,它们都是不断迭代、不断优化的产物或者解决方案。数据库技术发展到今天,跳表、LSM树等数据结构也被用于引擎设计中,这里我就不再一一展开了。

你心里要有个概念,数据库底层存储的核心就是基于这些数据模型的。每碰到一个新数据库,我们需要先关注它的数据模型,这样才能从理论上分析出这个数据库的适用场景。

截止到这里,我用了半篇文章的篇幅和你介绍了不同的数据结构,以及它们的适用场景,你可能会觉得有些枯燥。但是,我建议你还是要多花一些时间来理解这部分内容,毕竟这是数据库处理数据的核心概念之一,在分析问题的时候会经常用到。当你理解了索引的模型后,就会发现在分析问题的时候会有一个更清晰的视角,体会到引擎设计的精妙之处。

MySQL中,索引是在存储引擎层实现的,索引分为主键索引(key)、全文索引(FULLTEXT)、普通索引(NORMAL)、空间索引(SPATIAL)、唯一索引(UNIQUE),具体详解在下一篇介绍。

    推荐阅读
  • 周星驰邀请黄渤演戏(周星驰擅养宝盒)

    “天上没有乌云盖,为何不见情哥来……”这首歌出自电影《越光宝盒》。完全可以减轻工作压力,乐一乐。由此可见,娱乐与职场是现代普通民众生存场地的两个重点。这部喜剧片开幕便是由孙俪划着木筏唱着“天上没有乌云盖,为何不见情哥来……”落水,然后被山贼郑中基救起。“越光宝盒”除了剧情台词对白道具等夸张外,明星阵容也相当强大。这可能是亮点之一。而那首“天上没有乌云盖”的歌,的确清新,切合了整部喜剧。

  • 日式麦茶做法(具体有什么步骤)

    接下来我们就一起去研究一下吧!日式麦茶做法散装的大麦茶可以用锅煮着喝,一把大麦茶加上两升水,煮15分钟左右,或煮开后倒入茶壶中多次冲泡。如果是袋装的大麦茶,用沸水冲泡即可。把大麦茶放入水中煮开,倒入茶杯中,可趁热饮用,可摊凉再饮。大麦茶适合单泡,不适宜搭配其他茶。

  • 豆腐也能吃出幸福感的做法(豆腐如何做出幸福感)

    豆腐也能吃出幸福感的做法?下面希望有你要的答案,我们一起来看看吧!肉馅中加入葱姜碎,蚝油香油生抽搅拌均匀。将肉馅夹在两片豆腐中。锅中注入油,加入豆腐夹。煎炸至一面金黄。烹入料酒加入生抽糖蚝油,在倒入鸡汤。关小火,焖制20分钟。加入盐调味后收干汤汁即可。

  • 治淋病用什么药最好 治疗淋病那种药最好

    大观霉素耐药菌株的出现使它们成为可行性代用品。氨基糖甙类和氨基环状糖醇类主要作用为抑制菌体蛋白合成。用于治疗对青霉素耐药或过敏的患者。如妊娠后淋病复发,应该用青霉素作正规治疗,产后给新生儿滴抗淋菌的眼药水。如为淋菌性眼炎,治疗不及时可导致失明。

  • 人生感悟简短经典语录(感悟句子盘点)

    世界上没有一个永远不被毁谤的人,也没有一个永远被赞叹的人当你话多的时候,别人要批评你,当你话少的时候,别人要批评你,当你沈默的时候,别人还是要批评你在这个世界上,没有一个人不被批评的,我来为大家科普一下关于人生感悟简短经典语录?当你话多的时候,别人要批评你,当你话少的时候,别人要批评你,当你沈默的时候,别人还是要批评你。别奢求收获与付出对等,得到与努力持平,纠结于落空的梦想,不若投入下一次追逐。

  • 香炒方便面怎么做 炒方便面怎么做好吃?

    5、锅中倒入食用油,然后将小米椒放上去,炒出香味,再把其他配菜倒进去翻炒一下。

  • 孩子误食一点点干燥剂怎么办(孩子误食干燥剂怎么办)

    孩子年龄小,很容易出现“误食”事故,其中常见的误食事故之一是“干燥剂”。干燥剂的种类有多种,特别常见的是硅胶,除此之外还有生石灰、氯化钙等。氯化钙经常被用于衣物除湿。基于硅胶的推测致死剂量,每1kg体重为15g以上。情况严重的话,要及时送医。

  • 成都海鲜市场上的黑马(探访今晨成都商超菜市)

    利华农贸市场因为疫情防控需要,成都市居民原则居家期间,最让人关心的就是米面粮油、水果蔬菜、禽蛋肉类等是否得到保障。早上7点半,在成华区跳蹬河大棚市场,工作人员正在指挥前来购物的居民有序停好共享单车、电动车,佩戴好口罩、持24小时核酸阴性报告才能进入市场。同时,为了保证防疫安全,会要求入场商户每日进行核酸检测,并测量体温。蔬菜品种超过50种。全国党媒信息公共平台提供信息发布传播服务。

  • 卧推肩胛骨收紧技巧(收缩肩胛骨的方法及注意事项)

    卧推肩胛骨收紧技巧步骤主要是:先肩胛骨收紧即后背部两边向后靠近,最后收缩,下拉、下沉。可以采用向后拉、向下拉以及使上身由前倾到挺直的多种动作来收缩肩胛骨。肩胛骨收缩的注意事项:注意先掌握正确的动作标准,然后逐渐增加负重。腰部轻微反弓,卧推中只需要头部、上背部和臀部始终紧贴凳面,腰部可以稍微的反弓。肩胛骨要下沉,不得上抬,用背部的斜方肌发力,不要耸肩。

  • 怎样辨别真假石榴石(专家为您揭秘怎么鉴定石榴石真假)

    石榴石对比细腻,外表手感很滑,摸起来很舒适很油的觉得,不是粉晶的“玻璃”感觉。石榴石的硬度虽然高,但是其质地是属于脆性的,所以市场上出售的石榴石饰品上都会有一些裂纹存在,而这或多或少都将会影响到石榴石的价格。石榴石手串第四看光泽度:石榴石的光泽强,且看上去会有金属感,而在强光下会有朦胧之感。