范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Mysql探索之索引详解,又能和面试官互扯了

  前言索引是什么?有什么利弊?一旦在面试中被问道,对于新入门的小白可能是个棘手的问题。本篇文章将会详细讲述什么是索引、索引的优缺点、数据结构等等常见的知识。什么是索引索引就是一种的数据结构,存储表中特定列的值并对值进行排序,所以是在表的列上面创建的。索引将通过缩小一张表中需要查询的记录的数目来加快搜索的速度。如果没有索引,数据库不得不进行全表扫描。索引就好比一本书的目录,它会让你更快的找到内容。索引的优点通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。可以大大加快数据的检索速度,避免进行全表的数据扫描,大大减少遍历匹配的行数,这也是创建索引的最主要的原因。可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。索引的缺点创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。在哪些列建立索引在经常需要搜索的列上,可以加快搜索的速度;在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。不在哪些列建索引?对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。索引的数据结构
  常见的索引的数据结构有:B+Tree、Hash索引、FullText索引、R-Tree索引。Hash 索引
  1. 概述:
  MySQL 中,只有Memory存储引擎支持Hash索引,是Memory表的默认索引类型。hash 索引把数据的索引以 hash 值形式组织起来,因此检索效率非常高,可以一次定位,不像B-/+Tree索引需要进行从根节点到叶节点的多次 IO 操作。
  2. Hash 索引的缺点:
  ① Hash 索引仅仅能满足等值的查询,不能满足范围查询。因为数据在经过 Hash 算法后,其大小关系就可能发生变化。② Hash 索引不能被排序。同样是因为数据经过 Hash 算法后,大小关系就可能发生变化,排序是没有意义的。
  ③ Hash 索引不能避免表数据的扫描。因为发生 Hash 碰撞时,仅仅比较 Hash 值是不够的,需要比较实际的值以判定是否符合要求。
  ④ Hash 索引在发生大量 Hash 值相同的情况时性能不一定比 B-Tree 索引高。因为碰撞情况会导致多次的表数据的扫描,造成整体性能的低下,可以通过采用合适的 Hash 算法一定程度解决这个问题。
  ⑤ Hash 索引不能使用部分索引键查询。因为当使用组合索引情况时,是把多个数据库列数据合并后再计算 Hash 值,所以对单独列数据计算 Hash 值是没有意义的。FullText 索引
  1. 概述:
  全文索引,目前 MySQL 中只有MyISAM存储引擎支持,并且只有char、varchar、text 类型支持。它用于替代效率较低的like 模糊匹配操作,而且可以通过多字段组合的全文索引一次性全模糊匹配多个字段。
  2. 存储结构:
  同样使用B-Tree存放索引数据,但使用的是特定的算法,将字段数据分割后再进行索引(一般每 4 个字节一次分割),索引文件存储的是分割前的索引字符串集合,与分割后的索引信息,对应 Btree 结构的节点存储的是分割后的词信息以及它在分割前的索引字符串集合中的位置。B-/+Tree 索引B+Tree 是 mysql 使用最频繁的一个索引数据结构,是 Innodb 和 Myisam 存储引擎模式的索引类型。相对 Hash 索引,B+树在查找单条记录的速度比不上 Hash 索引,但是更适合排序等操作。
  1. B+Tree 索引的优点:带顺序访问指针的 B+Tree:B+Tree 所有索引数据都在叶子结点上,并且增加了顺序访问指针,每个叶子节点都有指向相邻叶子节点的指针。这样做是为了提高区间查询效率,例如查询 key 为从 18 到 49 的所有数据记录,当找到 18 后,只需顺着节点和指针顺序遍历就可以一次性访问到所有数据节点,极大提到了区间查询效率。大大减少磁盘 I/O 读取次数。B-/+Tree 索引:文件系统及数据库系统普遍采用 B-/+Tree 作为索引结构:一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上。这样的话,索引查找过程中就要产生磁盘 I/O 消耗,相对于内存存取,I/O 存取的消耗要高几个数量级,所以评价一个数据结构作为索引的优劣最重要的指标就是在查找过程中磁盘 I/O 操作次数的渐进复杂度。换句话说,索引的结构组织要尽量减少查找过程中磁盘 I/O 的存取次数。局部性处理与磁盘预读由于存储介质的特性,磁盘本身存取就比主存慢很多,再加上机械运动耗费,磁盘的存取速度往往是主存的几百分分之一,因此为了提高效率,要尽量减少磁盘 I/O。为了达到这个目的,磁盘往往不是严格按需读取,而是每次都会预读,即使只需要一个字节,磁盘也会从这个位置开始,顺序向后读取一定长度的数据放入内存。由于磁盘顺序读取的效率很高(不需要寻道时间,只需很少的旋转时间),因此对于具有局部性的程序来说,预读可以提高 I/O 效率。预读的长度一般为页(page)的整倍数。页是计算机管理存储器的逻辑块,硬件及操作系统往往将主存和磁盘存储区分割为连续的大小相等的块,每个存储块称为一页(在许多操作系统中,页得大小通常为 4k),主存和磁盘以页为单位交换数据。当程序要读取的数据不在主存中时,会触发一个缺页异常,此时系统会向磁盘发出读盘信号,磁盘会找到数据的起始位置并向后连续读取一页或几页载入内存中,然后异常返回,程序继续运行。B-/+Tree 索引的性能分析上文说过一般使用磁盘 I/O 次数评价索引结构的优劣。先从 B-Tree 分析,根据 B-Tree 的定义,可知检索一次最多需要访问 h 个节点。数据库系统的设计者巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次 I/O 就可以完全载入。为了达到这个目的,在实际实现 B-Tree 还需要使用如下技巧:每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个节点只需一次 I/O。B-Tree 中一次检索最多需要h-1次 I/O(根节点常驻内存),渐进复杂度为O(h)=O(logdN)。一般实际应用中,出度 d 是非常大的数字,通常超过 100,因此 h 非常小(通常不超过 3)。综上所述,用 B-Tree 作为索引结构效率是非常高的。而红黑树这种结构,h 明显要深的多。由于逻辑上很近的节点(父子)物理上可能很远,无法利用局部性,所以红黑树的 I/O 渐进复杂度也为 O(h),效率明显比 B-Tree 差很多。另外,B+Tree 更适合外存索引,原因和内节点出度 d 有关。从上面分析可以看到,d 越大索引的性能越好,而出度的上限取决于节点内 key 和 data 的大小,由于 B+Tree 内节点去掉了 data 域,因此可以拥有更大的出度,拥有更好的性能。(详细见本部分第 3 点)B-Tree 与 B+Tree 的对比根据 B-Tree 和 B+Tree 的结构,我们可以发现 B+树相比于 B 树,在文件系统或者数据库系统当中,更有优势,原因如下:
  1. B+树的磁盘读写代价更低
  B+树的内部结点并没有指向关键字具体信息的指针。因此其内部结点相对 B 树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多。相对来说 I/O 读写次数也就降低了。
  2. B+树的查询效率更加稳定
  由于内部结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。
  3. B+树更有利于对数据库的扫描
  B 树在提高了磁盘 IO 性能的同时并没有解决元素遍历的效率低下的问题,而 B+树只需要遍历叶子节点就可以解决对全部关键字信息的扫描,所以对于数据库中频繁使用的 range query,B+树有着更高的性能。MySQL 索引的实现在 MySQL 中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,本部分主要讨论 MyISAM 和 InnoDB 两个存储引擎的索引实现方式。MyISAM 索引的实现
  1. 主键索引
  MyISAM 引擎使用 B+Tree 作为索引结构,叶节点的 data 域存放的是数据记录的地址。下图是 MyISAM 索引的原理图:
  这里设表一共有三列,假设我们以 Col1 为主键,则上图是一个 MyISAM 表的主索引(Primary key)示意。可以看出 MyISAM 的索引文件仅仅保存数据记录的地址。
  2. 辅助索引
  在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求 key 是唯一的,而辅助索引的 key 可以重复。如果我们在 Col2 上建立一个辅助索引,则此索引的结构如下图所示:
  同样也是一颗 B+Tree,data 域保存数据记录的地址。因此,MyISAM 中索引检索的算法为首先按照 B+Tree 搜索算法搜索索引,如果指定的 Key 存在,则取出其 data 域的值,然后以 data 域的值为地址,读取相应数据记录。MyISAM 的索引方式也叫做"非聚集"的,之所以这么称呼是为了与 InnoDB 的聚集索引区分。InnoDB 索引的实现虽然 InnoDB 也使用 B+Tree 作为索引结构,但具体实现方式却不相同。
  1. 主键索引
  与 MyISAM 第一个重大区别是 InnoDB 的数据文件本身就是索引文件。从上文知道,MyISAM 索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在 InnoDB 中,表数据文件本身就是按 B+Tree 组织的一个索引结构,这棵树的叶节点 data 域保存了完整的数据记录。这个索引的 key 是数据表的主键,因此 InnoDB 表数据文件本身就是主索引。
  上图是 InnoDB 主索引(同时也是数据文件)的示意图,可以看到叶节点包含了完整的数据记录。这种索引叫做聚集索引。因为 InnoDB 的数据文件本身要按主键聚集,所以 InnoDB 要求表必须有主键(MyISAM 可以没有),如果没有显式指定,则 MySQL 系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则 MySQL 自动为 InnoDB 表生成一个隐含字段作为主键,这个字段长度为 6 个字节,类型为长整形。
  2. 辅助索引
  第二个与 MyISAM 索引的不同是 InnoDB 的辅助索引 data 域存储相应记录主键的值而不是地址。换句话说,InnoDB 的所有辅助索引都引用主键作为 data 域。例如,下图为定义在 Col3 上的一个辅助索引:
  这里以英文字符的 ASCII 码作为比较准则。聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。InnoDB 表是基于聚簇索引建立的。因此 InnoDB 的索引能提供一种非常快速的主键查找性能。不过,它的辅助索引也会包含主键列,所以,如果主键使用过长的字段,将会导致其他辅助索变得更大。如果想在表上定义 、很多索引,则争取尽量把主键定义得小一些。InnoDB 不会压缩索引。

在量子世界玩数独被判为无解的数学谜题,物理学家找出了答案图片来源Pixabay数学家欧拉提出过一个类似66数独的36军官问题从6个军团各挑6种不同军衔的军官一共36人,将这36名军官排成一个方阵,能否让每一行每一列的军官所属的军团和军衔如何把人类的视力提高一亿倍?撰文吴建永责编王雨丹光分七彩在上篇文章钻石之火的秘密中我们知道,钻石的火彩本质上是白光通过折射变成多种色彩光的现象。我们时常见到彩虹,在太阳下走过沙地,也常能看到沙粒反射出的点点闪五十岁的人眼睛时而模糊的厉害,是常看手机影响的吗?正常吗?我有亲身体会,我不是医生,但我有些经验可以告诉大家。这种现象很正常,人过40以后,大多数人多多少少都有点白内障。现在我告诉大家我的方法。每天晚上滴一两滴白内停。眼睛明显明亮的多了。微信试行1065工作制,强制员工下班果粉之家,专业苹果手机技术研究十年!您身边的苹果专家根据最新消息,微信事业群正在试运行1065工作制,即员工早上10点上班,晚上6点下班,每周工作5天。为了让员工们能够遵守1065降至1259,120W快充也打不倒的红米Note10Pro,究竟有何魅力相信大家都对红米手机非常数字,小米手机的子品牌,自成立之日起,就致力于性价比手机市场,每一款新机的性价比相当高,深受普通用户欢迎。其中数字系列定位百元机,Note系列机型主打千元机iPhone14mini曝光120hz配后置双摄,美与性能的碰撞虽然说这几年来苹果手机在外观方面改变的并不是很大,但是还是得到了非常多的果粉的支持的。但是就小芳个人而言,苹果手机当中的mini系列是最不受待见的机型了。可能是因为苹果mini系列500元价位的路由器怎么选这个价位首选小米,TPLINK这些品牌,可以买到中高端配置的路由器了。三大品牌的路由器虽然不错,但500元只能买到入门级的产品,性价比不高。TPLINKXDR5480TPLINK去励志的华为音箱,联合帝瓦雷!击败多国音响品牌!销量顺利登顶蓝牙音箱是当下最火的音箱产品,在以前,在高端蓝牙音箱中,鲜有国产品牌,如今,已经有了,它就是我们熟知的华为旗下的音箱,说到华为,可能很多人就懵逼,华为怎么跟音响有关呢?华为不是主要iPhone13ProMax充电测试,30W和20W充电头,差距到底大不大?iPhone13ProMax配备4352mAh电池,尽管电池容量比不过安卓手机,但它却是目前性能最强且续航时间最长的旗舰手机,主要功率归于A15芯片功耗控制以及iOS系统的优化,横OPPOFindX5强悍配置出炉,FindX3沦为白菜机创悲惨纪录2月18日,ColorOS游戏优化架构师鞠怀伟对OPPOFindX5系列进行预热表示,FindX5系列搭载HyperBoost全连杆防抖技术,稳定到手抖,5小时持久战,平均帧率为8威马汽车W6配备三大智能科技,讲述它的不凡实力威马汽车三次荣登全球独角兽企业500强榜单,展现出的是其强大的智能科技实力和强劲的研发实力。于今年上半年推出的威马W6,可谓是威马汽车集科技实力之大成者的产品,是证实威马汽车科技与
对于华为手机,华为5G信号,麒麟9000芯片的看法看了这么多评论真的有点脑袋疼,给大家把思路捋捋1高通不用给华为交专利费,华为需要给高通交因为234G信号高通掌握绝大部分专利,只要用就必须交,但是绝对比其他厂商少,因为本身华为自己P50就这?太便宜了吧在缺席了小半年之后,华为P50系列终于正式与大家见面,作为一款本应该在2021年上半年发布的旗舰产品,由于芯片问题一直拖延到7月29日才发布,华为属实是遇到了难处。而随着华为P502021年可以闭着眼睛买的两部手机,配置好颜值高,两年不过时iPhone12iPhoen12是618线上大促的冠军,销量高达180万台,好评95。如果想买一部能用很久的手机,可以选择这一款。另外,苹果将于9月发布iPhone13,为了给新机震惊!猫为流体被科学证实猫咪为液态已被科学家证实并获诺贝尔奖具体是这样的某天,来自法国里昂大学的科学家MarcAntoineFardin马克安托万方丹,发布了论文猫的流体力学研究。华丽丽的斩获了搞笑诺贝尔奖物理学奖,以及100亿的奖金哟!虽观东京奥运首日的感受我想说道2020东京奥运会,大家都不陌生了,观看完开幕式之后,感觉和2008年的北京奥运会简直没得比较,差距一目了然。可谁又能想到此次的东京奥运会场馆在还能看到北京奥运会时期的媒体手机推荐300元价位手机推荐(参数与体验报告结合分析)前面我有介绍过100和200元左右的手机推荐(在我的主页,有兴趣的可以去看看哦!)今天来说说300左右有什么值得买的手机吧300元价位手机分两篇,这是篇本期推荐的是红米note5红苹果iPhone13的杀手来了,库克没料到,这家中企出手这么狠iPhone系列手机自进入我国市场以来,就迅速收割了一大波粉丝,以至于每次面对苹果新品发布会,国产厂商都会退避三舍,以免自取其辱,而近些年敢于正面硬刚苹果的,或许也只有华为了。可惜1000台!关于光刻机,ASML比我们更着急?光刻机作为芯片制造的核心设备,可谓是现阶段科技圈里最被热议的话题,因为它关系着我国芯片产业的国产化进程,是华为等中企解开芯片封锁的关键一步。全球最先进的光刻厂商是荷兰ASML,它几国产厂商集体沉默,华为上线鸿蒙套壳系统?倪光南的呼吁该重视了在二十年前,时任科技部长的徐冠华就一针见血地指出了国内信息产业缺芯少魂的短板,并表示这是架在国产芯片产业脖子上的两把利刃,芯指的是芯片,魂指的是操作系统。没想到这么快就一语成谶,华认输了?美批准610亿美元技术对华为出口,任正非正式表态华为5G技术的崛起,一举打破了美企在通信领域数十年的主导地位,这让老美深感不安,担心未来会有更多的领域受到中企的冲击,于是在这两三年的时间里对华为发起了接连4轮打压,比如造谣华为设听得懂看得远跑得稳,高通携手伙伴,用5G加持汽车新能力过去,普通消费者对于5G的认知,大多在手机等消费终端层面,而经过商用两年多的发展,随着5G网络急速大面积覆盖后,5G也已经逐渐渗透到了各个垂直行业领域,带来了万物智能互联的时代,其