个该搞定的数据库索引疑问! 16

  • 电脑网络维修
  • 2024-11-15

大家好,我是悟空呀,这次咱们来细说下 MySQL 中的索引。

咱们先从一个面试场景开局:

面试官:了解过数据库索引吗?

候选人:听过一些,底层数据结构如同是二叉树,不对,如同是 B 树,哦,我想起来了,如同是 B+树……(像极了当年面试的我)

面试官:听过哈希索引吗?

候选人:我知道哈希表,哈希索引没听过

面试官:当天面试先到这里了,回去等信息吧……

好受揭示:本文是数据库索引的便捷入门篇,前面会经过图解的形式逐渐带大家深化索引的原理,敬请等候!

先引入一个便捷的示例,经过示例操作解释一下为什么须要数据库索引。

假定咱们有一个名为 t_employee 的数据库表,这个数据库表有三列:name,age,address,数据量有上万行。

假设咱们想要查找一切名为「leixiaoshuai」员工的具体信息,只要要写一个便捷的 SQL 语句就可以搞定,置信大家都会写。

WHEREname=

假设没有索引,会出现什么?

一旦咱们运转了这条 SQL 查问语句,在数据库外部是如何上班的呢?数据库会搜查 t_employee 表中的每一行,从而确定员工的名字(name)能否为 ‘leixiaoshuai’。由于咱们想要失掉每一个名字为 leixiaoshuai 的雇员信息,在查问到第一个合乎条件的行记载后,不能中止查问,由于或许还有其余合乎条件的行。所以,必需一行一行的查找直到最后一行,这就象征数据库不得不审核上万行数据能力找到一切名字为 leixiaoshuai 的员工。这就是所谓的 全表扫描

数据库索引如何协助提高性能?

你或许会想:「这么便捷的查问语句居然还须要全表扫描,数据库也太笨了吧?!」

这就相似于用人眼从头到尾逐字逐句读一本书,效率太低了!

那应该怎样办?痴呆的你必需想到处置打算了:「加个索引啊」。

这就是索引派上用场的时刻了,经常使用索引的目标就是**经过缩小表中须要审核的记载/行的数量来减速搜查查问。**说的再便捷点:「索引就是用来减速查问的」。

什么是索引?

那么疑问来了,什么是索引呢?索引实质是一种数据结构(最经常出现的是 B+树),是在表的列上创立的。

索引的数据结构是什么样的?

经常出现MySQL索引普通分为: Hash索引 和**B+**树索引,InnoDB引擎中自动的是B+树。

B+树是最罕用于索引的数据结构,期间复杂度低:查找、删除、拔出操作都可以可以在 logn 期间内成功。另外一个关键要素存储在 B+树 中的数据是 有序的

在B+树惯例检索场景下,从根节点到叶子节点的搜查效率基本相当,不会出现大幅动摇,而且基于索引的顺序扫描时,也可以应用双向指针极速左右移动,效率十分高。

哈希索引就是驳回必定的哈希算法,把键值换算成新的哈希值,检索时不须要相似B+树那样从根节点到叶子节点逐级查找,只要一次性哈希算法即可立刻定位到相应的位置,速度十分快。

哈希表索引是如何上班的?

假设你在创立索引时指定数据结构为「哈希表」,那这些索引也可称为「哈希索引」。

哈希索引的好处十分显著,在必定场景下,检索指定值时哈希表的效率极高。比如上方咱们探讨的一个查问语句:SELECT * FROM t_employee WHERE name = ‘leixiaoshuai’,假设在 name 列上加一个哈希索引,检索速度有或许会成倍优化。

哈系索引的上班形式是将列的值作为索引的键值(key),键值相对应实践的值(value)是指向该表中相应行的指针。由于哈希表基本上可以看作是关联数组,一个典型的数据项就像 「leixiaoshuai => 0x996996」,而 0x996996 是对内存中表中蕴含 leixiaoshuai 这一行的援用。在哈系索引的中查问一个像 leixiaoshuai 这样的值,并失掉对应行的在内存中的援用,显著要比扫描全表取得值为 leixiaoshuai 的行的形式快很多。

哈希索引的缺陷

上方说了哈希索引的好处,那哈希索引的缺陷也是绕不过去的。

哈希表是无顺的数据结构,关于很多类型的查问语句哈希索引都无能为力。举例来说,假设你想要找出一切小于40岁的员工。你怎样经常使用经常使用哈希索引启动查问?这无法行,由于哈希表只适宜查问键值对,也就是说查问相等的查问(例:like “WHERE name = ‘leixiaoshuai’)。哈希表的键值映射也暗示其键的存储是无序的。这就是为什么哈希索引通常不是数据库索引的自动数据结构, 由于在作为索引的数据结构时,其不像B+Tree那么灵敏

总结一下缺陷:

还有什么其余类型的索引?

经常出现的还有:R 树和位图索引。

R 树通罕用来为空间疑问提供协助。例如,一个查问要求“查问出一切距离我两公里之内的麦当劳”,假设数据库表经常使用R树索引,这类查问的效率将会提高。

位图索引(bitmap index), 这类索引适宜放在蕴含布尔值(true 和 false)的列上。

索引如何提高性能?

由于索引基本上是用来存储列值的数据结构,这使查找这些列值愈加极速。假设索引经常使用B+树数据结构,那么其中的数据是有序的,有序的列值可以极大的优化性能。

假设咱们在 name 这一列上创立一个 B+树 索引,这象征着当咱们用之前的SQL查找name=‘leixiaoshuai‘时不须要再扫描全表,而是用索引查找去查找名字为‘leixiaoshuai’的员工,由于索引曾经依照按字母顺序排序。索引 曾经排序 象征着查问一个名字会快很多,由于名字少字母为‘L’的员工都是陈列在一同的。另外关键的一点是,索引同时存储了表中相应行的指针以失掉其余列的数据。

数据库索引中究竟存的是什么?

你如今曾经知道数据库索引是创立在表的某列上的,并且存储了这一列的一切值。但是须要了解的重点是 数据库索引并不存储这个表中其余列(字段)的值 。举例来说,假设咱们在 name 列创立索引,那么 age 列和 address 列上的值并不会存储在这个索引当中。假设咱们确实把其余一切字段也存储在个这个索引中,那这样会占用太大的空间而且会十分低效。

索引还存储指向表行的指针

假设咱们在索引里找到某一条记载作为索引的列的值,如何能力找到这一条记载的其它值呢?

这很便捷,数据库索引同时存储了指向表中的相应行的指针。指针是指一块内存区域, 该内存区域记载的是对硬盘上记载的相应行的数据的援用。因此,索引中除了存储列的值,还存储着一个指向内行数据的索引。也就是说,索引中的name这列的某个值(或许节点)可以形容为 (“leixiaoshuai”, 0x996996), 0x996996 就是蕴含 “leixiaoshuai”那行数据在硬盘上的地址。假设没有这个援用,你就只能访问到一个独自的值(“leixiaoshuai”),而这样没无心义,由于你不能失掉这一行记载的employee的其余值-例如地址(address)和年龄(age)。

数据库如何知道何时经常使用索引?

当你运转一条查问 SQL 语句时,数据库会审核在查问的列上能否有索引。假定 name 列上确实创立了索引,数据库会接着审核经常使用这个索引做查问能否正当 ,由于有些场景下,经常使用索引比起全表扫描会愈加低效。

可以强迫数据库在查问中经常使用索引吗?

通常来说, 你不会通知数据库什么时刻经常使用索引,数据库自己选择。

如何在SQL中创立索引?

上方是在前面示例中的Employee_Name列上创立索引时实践SQL的外观:

如何在SQL中创立联结(多列)索引?

咱们可以在age 和 address 两列上创立联结索引,SQL如下:

可以把数据库索引类比成什么?

一个十分好的类比是把数据库索引看作是书的索引。

你从头到尾逐字逐行读完就是「全表扫描」;

你翻看目录筛选感兴味的局部阅读就是走了索引。

经常使用数据库索引有什么代价?

既然索引好处这么多,那给一切列加上索引不就完事了,no no no,加索引是有代价的。

(1)索引会占用空间。你的表越大,索引占用的空间越大。

(2)在降级操作有性能损失。当你在表中增加、删除或许降级行数据的时刻, 在索引中也会有相反的操作。

基本准则是:假设表中某列在查问环节中经常使用的十分频繁,那就在该列上创立索引。

参考:

  • 关注微信

本网站的文章部分内容可能来源于网络和网友发布,仅供大家学习与参考,如有侵权,请联系站长进行删除处理,不代表本网站立场,转载联系作者并注明出处:https://duobeib.com/diannaowangluoweixiu/9256.html

猜你喜欢

热门标签

洗手盆如何疏浚梗塞 洗手盆为何梗塞 iPhone提价霸占4G市场等于原价8折 明码箱怎样设置明码锁 苏泊尔电饭锅保修多久 长城画龙G8253YN彩电输入指令画面变暗疑问检修 彩星彩电解除童锁方法大全 三星笔记本培修点上海 液晶显示器花屏培修视频 燃气热水器不热水要素 热水器不上班经常出现3种处置方法 无氟空调跟有氟空调有什么区别 norltz燃气热水器售后电话 大连站和大连北站哪个离周水子机场近 热水器显示屏亮显示温度不加热 铁猫牌保险箱高效开锁技巧 科技助力安保无忧 创维8R80 汽修 a1265和c3182是什么管 为什么电热水器不能即热 标致空调为什么不冷 神舟培修笔记本培修 dell1420内存更新 青岛自来水公司培修热线电话 包头美的洗衣机全国各市售后服务预定热线号码2024年修缮点降级 创维42k08rd更新 空调为什么运转异响 热水器为何会漏水 该如何处置 什么是可以自己处置的 重庆华帝售后电话 波轮洗衣机荡涤价格 鼎新热水器 留意了!不是水平疑问! 马桶产生了这5个现象 方便 极速 邢台空调移机电话上门服务 扬子空调缺点代码e4是什么疑问 宏基4736zG可以装置W11吗 奥克斯空调培修官方 为什么突然空调滴水很多 乐视s40air刷机包 未联络视的提高方向 官网培修 格力空调售后电话 皇明太阳能电话 看尚X55液晶电视进入工厂形式和软件更新方法 燃气热水器缺点代码

热门资讯

关注我们

微信公众号