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

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

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

数据库索引对于程序开发人员都不陌生。不可避免地,多个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),具体详解在下一篇介绍。

    推荐阅读
  • 一斤橄榄泡几斤白酒(大家可以试着做一下)

    接下来我们就一起去研究一下吧!一斤橄榄泡几斤白酒一般浸泡用酒需要6-8倍酒液,一斤橄榄最少需要6斤白酒浸泡,酒精度35-45度即可,时间15天以上。饮用时可以加些冰糖或蜂蜜调整口感。橄榄酒主要出产于我国地区甘肃省陇南市武都区境内。橄榄酒是利用水、鲜橄榄果、高粱、大米、糯米、小麦、玉米共同酿造而成。橄榄酒有清热解毒,利咽化痰、生津止咳等作用。

  • 泰迪狗夏天要注意事项(夏天饲养泰迪狗要注意哪些问题)

    以下内容希望对你有帮助!泰迪狗夏天要注意事项不要在太热的时候带狗狗在外逗留太久,以防小狗中暑。让小狗喝足够的水,补充必要的水分。定期洗澡,避免狗狗长期不洗澡,味道太重。最好让小狗只吃狗粮,避免吃变质食物引起肠胃不适。让小狗睡在通风凉爽的位置,不要还睡在冬天用的狗窝里。别以为人吃的水果小狗也会爱吃,不要将高糖分的水果给小狗吃。注意及时进行体内和体外的驱虫,保证小狗身体健康、干净。

  • 锦绣南歌大结局是什么(锦绣南歌简介)

    骊歌在收拾东西的时候,发现了那道圣旨,这才知道彭城王最近身体不适,以及要和他归隐山林的原因,他担心陈师兄的安全,急忙来到了三九堂,发现三九堂已经关张。骊歌发现彭城王来了,就跑过来扑进他的怀里,两个人很开心的拥抱在一起。

  • 酸汤黄瓜肥牛卷的做法(如何做酸汤黄瓜肥牛卷)

    酸汤黄瓜肥牛卷的做法黄瓜入开水焯一分钟沥起来待用。粉丝和平菇洗净泡五分钟沥起来放好备用。食材准备齐了,把锅点火。水开之后依次放入平菇,黄瓜,同时加入盐,鸡精,胡椒粉调味。再开以后沥起平菇和黄瓜装入大碗打底备用,再放入粉丝,烫一下就好,沥起来放入碗内。锅中继续倒入焯好的肥牛,烧开。连汤带肉淋在底料上。锅洗干净,烧热放少许油,将小尖椒爆炒出香,洒在碗内。

  • 木行是什么意思(木行解释)

    跟着小编一起来看一看吧!木行是什么意思木行[mùxíng]:谓五行说中的木德。隋李德林《为周禅隋诏》:“木行已谢,火运既兴,河洛出革命之符,星辰表代终之象。”宋陈普《莲花赋》:“夫天地之生物,各品类以赋形,惟木行之为盛,分四序而敷荣。”

  • 二级建造师含金量高吗(想了解具体情况的快看过来)

    二级建造师含金量高吗二级建造师的含金量还是很高的,二级建造师是中小型工程项目经理必备证书之一,未来也是项目技术负责人的必备证书之一,二级建造师证书的含金量伴随着国家基础建设的日益丰富而逐步上升。二级建造师考试科目:《建设工程施工管理》考试内容包括施工方的项目管理、施工成本管理、施工进度管理、施工质量管理、施工合同管理、施工信息管理、施工质量管理等。

  • 微波炉菜谱(做菜居然那么简单)

    接下来我们就一起去研究一下吧!微波炉菜谱主料:茄子1根。茄子去蒂对半切开不切断,用刀划四刀。将茄子放入烤盘,盖上保鲜膜扎几个小孔,放入微波炉加热6分钟。蒜末、葱花、五香粉、孜然粉、盐、蚝油和生抽调成酱汁。取出茄子淋上酱汁再放入微波炉加热6分钟。

  • 描写夜空的优美句子(关于描写夜空的优美句子文案)

    大约七点钟,天空中呈现出一片蔚蓝色,还有一颗星星和一轮镰刀似的月牙儿挂在空中。经意间抬头,一颗小星星悬挂在西南的上空。又大,又亮,就那么一颗,却是那么耀眼,在这日落月未升的傍晚时分。天空中那皎洁的月光装饰了夏天的夜空,也装饰了整个大地。一轮圆月倒映在水面上,晚风一吹,波光粼粼。月亮妈妈带着自己的孩子们在夜空中散步。在腾空的一瞬间,它仿佛猛地一跳,浑身披满水花,让多情的大海把它冲洗得分外明丽和洁净。

  • 猹是什么梗(网络语猹是什么梗)

    猹是一种动物,读作chá,现在在网上也是吃瓜群众的代称,我来为大家科普一下关于猹是什么梗?以下内容希望对你有帮助!因为在鲁迅的《故乡》一文里,猹总是会来瓜田里偷瓜吃,所以猹就变成了爱吃瓜的人的代名词,现在代指刷八卦信息、看最新八卦的网友们。附上一张经典的闰土在瓜田里举叉刀叉猹的配图。