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

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

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

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

    推荐阅读
  • 选购沉香手串最全攻略读懂不上当(沉香手串极受藏家青睐)

    选购沉香手串最全攻略读懂不上当?沉香的真伪沉香手串极受藏家青睐,如何识别它的真伪呢?专家指出,应注意以下几个方面:一、摸真正的沉香手串是越戴越黑亮的。现在市场上也有用杂木泡药水泡香油做成的假沉香,鉴别沉香手串时沉水不一定说明是真货。

  • 渭南城镇居民医疗保险报销办理流程及报销比例

    报销比例标准城镇居民基本医疗保险起付标准和报销比例按照参保人员的类别确定不同的标准。城镇居民在一个结算年度内住院治疗二次以上的,从第二次住院治疗起,不再收取起付标准的费用。转院或者二次以上住院的,按照规定的转入或再次入住医院起付标准补足差额。

  • 比较简单的游戏(三款好玩游戏送给你)

    比较简单的游戏弹球实验室:怀旧风,是这款游戏的主要卖点。玩的时候会不由自主地回想起童年,推荐“大龄儿童”下载玩两把。“斯奎德”属于休闲冒险类的VR小游戏,在这款游戏中你将扮演小精灵,通关层层关卡后方能拯救自己的家园。另外,游戏的整体画风以卡通为主,这也是此款游戏最吸引人的地方。而限时挑战模式中,玩家除了要在限定时间内吃到不同的灯笼,还要避免咬到龙身和龙尾。

  • 跑步机dis1是多少(跑步机dis1的解释)

    接下来我们就一起去了解一下吧!跑步机dis1是多少跑步机dis1指在跑步机上运动的距离,跑步机dis1表示在跑步机跑了1公里。不管是健身还是减肥贵在坚持的,通过适量运动距离的方式消耗身体多余的能量。dis是distance的缩写,距离的意思。

  • 女儿红和花雕酒的区别(女儿红与花雕酒的区别)

    女儿红和花雕酒没有区别。因花雕酒古时是由“女儿酒”演变而来。女儿红酒是一种具甜、酸、苦、辛、鲜、涩6味于一体的丰满酒体,加上有高出其他酒的营养价值,因而形成澄、香、醇、柔、绵、爽兼备的综合风格。

  • 梦到坐飞机是什么意思(梦见坐飞机意味着什么)

    梦见坐飞机,学业方面尤其是音乐、美术等技能科目,将非常顺利。假若飞机遇上乱流,则表示你的梦想会受到波折。怀有身孕的人梦见坐飞机,预示生男,夏占生女,忌动土。谈婚论嫁的人梦见坐飞机,说明女性年龄稍大无妨,只要互相了解最重要。创业的人梦见坐飞机,代表谨慎勿急躁,小心经营不会有亏损。准备考试的人梦见坐飞机,意味着不能如愿,成绩不理想。打算出门的人梦见坐飞机,建议平顺如意,若风大则延后出外。

  • 南通市同和小学招生条件+施教区+报名指南(2022年)

    根据崇川区教育体育局2022年度招生工作的相关精神,现将我校2022年一年级招生工作安排通告如下:一、招生对象2015年9月1日至2016年8月31日之间出生、实际居住在我校施教区内的符合招生条件的适龄儿童。入学户口及住址在审核确认后要求调整的,不予受理。入学儿童法定监护人住宅房屋产权证取得、户口迁入时间必须在2022年5月31日以前。根据上级部门规定,在报名时间以后提交入学材料的,一律由崇川区教育体育局统筹安排。

  • 1亿年前的鸟类(鸟类树木齐上阵)

    连动物们也纷纷被带坏了,澳洲的消防员就目击过一只啸栗鸢在一天放火七次,还有多种中型猛禽纵火事件被民间目击。而这一次其实更可能是一次历史遗留事件,与澳洲原住民的祖先,很久之前踏足这片土地的智人有关。距今45000年之前,在那个时间段可能发生了一些非同寻常的事情,但最重要的一件是,有一些智人穿过了冰封的海面,来到了6000万年没有与大陆交流物种的澳洲大陆。

  • 百香果的籽能种出苗吗(百香果的作用)

    百香果的籽不要乱扔,栽培的方式方法正确的话,用心栽培,百香果的籽也能种出苗。百香果又称鸡蛋果,因其含有多种水果香味而得名。百香果的营养丰富,富含多种维生素矿物质,是人们常食喜爱的水果之一。百香果食用,具有抗衰老,养颜美容、降脂降压,润肠通便的作用,对呼吸系统的疾病和心脑血管疾病有一定的辅助治疗作用。

  • 家里装修完多久能住(装修完才问多久能住)

    当购买的床垫到家后,要将尘膜撕开,让甲醛完全释放出来。但为了穿线,插座预留出来的孔却十分容易忽略封边。如果不及时更换,还有可能再次释放甲醛。虽然能马上见效,但是治标不治本,后续甲醛仍会持续泄漏,甲醛需要长期的治理才能抑制。找甲醛治理公司费用贵不说,最终效果也会一言难尽。③其次,在高温高湿的环境下,甲醛会加速释放。测试盒可能不够精准,但起码能知道屋内甲醛是否超标。抛开剂量谈毒性都是耍流氓。