文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

面试官问我索引为什么这快?我好像解释不清楚了

2024-12-02 19:26

关注

索引的类型(常见的)

索引的类型肯定不限制于这几项,既然我们知道分类了,我们接下来再来看看不同索引的创建方式。

不同索引的创建方式

其实如果你真的不会去写 SQL 去创建索引,最简单的,Navicat 你总是会用的吧,图形化的界面操作,你肯定也是了解的吧,那图形化直接操作不就好了。

这样子操作是不是简单明了,选择你想要创建索引的类型,然后指名你想要创建索引的字段,最后再给他加上个注释,完美解决,但是我们还是要写语句来看一下的。

1. 创建普通的索引

  1. ALTER TABLE table_name ADD INDEX index_name (column) 

比如我们有一张表叫做 user 我们想给 user 表中的一个叫做 phone 字段增加一个索引,应该怎么去写呢?

  1. ALTER TABLE user ADD INDEX phoneIndex (phone) 

这时候我们就创建好了一个索引了,索引的删除,相对来说也是非常的简单。其实说是创建索引,实际上就是给我们原有表中的某个字段上增加一个索引,这个大家一定得清楚哈,千万别和 Create 给搞混了。下面阿粉就直接简单的给大家称之为创建吧。

  1. ALTER TABLE testalter_tb1 DROP INDEX index_name 

这样删除我们刚才建立的索引就是

  1. ALTER TABLE user DROP INDEX phoneIndex 

这时候我们就能看到删除成功了。

  1. > OK 
  2. > 时间: 0.012s 

2. 创建唯一索引(unique)并删除

  1. ALTER TABLE user ADD unique phoneIndex (phone) 
  2. ALTER TABLE user DROP INDEX phoneIndex; 

千万不要想当然的认为创建的时候我指定了索引的类型,然后删除的时候也执行一个 ALTER TABLE user DROP unique phoneIndex; 阿粉亲身实践,确实是不成功的。

3. 创建主键索引(primary key)并删除

  1. ALTER TABLE user ADD PRIMARY KEY (phone): 
  2. ALTER TABLE user DROP PRIMARY KEY 

一般我们在建表的时候,都把这个主键索引都建好了,所以使用的场景并不是很多见。

4. 创建全文索引(fulltext)并删除

创建方式都差不多就是这样

  1. ALTER TABLE user ADD FULLTEXT phoneIndex (phone) 
  2. ALTER TABLE user DROP INDEX phoneIndex; 

既然我们了解了创建的方式了,那是不是该回归正题,说说为什么使用索引就会快,这就得涉及到索引的底层知识了,

索引的实现

在没有索引的情况下,我们查找数据只能按照从头到尾的顺序逐行查找,每查找一行数据,意味着我们要到到磁盘相应的位置去读取一条数据。

如果把查询一条数据分为到磁盘中查询和比对查询条件两步的话,到磁盘中查询的时间会远远大于比对查询条件的时间,这意味着在一次查询中,磁盘io占用了大部分的时间。更进一步地说,一次查询的效率取绝于磁盘io的次数,如果我们能够在一次查询中尽可能地降低磁盘io的次数,那么我们就能加快查询的速度。

所以我们就要开始引入索引,然后分析索引底层是如何实现查找迅速的。

实际上索引的底层实际上就是树,也就 B 树和 B+ 树,也可以称之为变种的 B+ 树。大家也都知道 Mysql中最常用的引擎像InnoDB和MyISAM,最终都选择了B+树作为索引。

那我们来说说这个B树和B+树。

B-树,也称为B树,是一种平衡的多叉树(可以对比一下平衡二叉查找树),它比较适用于对外查找。

画一个二阶B树:

二阶B树

那么我们为什么称他为二阶 B 树呢?这个阶数实际上就是说一个 节点 最多有几个 子节点。

我们上面的图,X元素,有2个子节点,A 元素,又有2个 子节点 C 和 D ,而 B 元素,又有 2 个子节点 E F ,也就是说一个节点最多有多少个子节点,我们就称它为几阶的树,通常这个值一般用 m 来表示。

注意我们所说的,也就是一个节点上 最多 的子节点数,如果有一个分支是有三个节点,而有一个是 两个节点 ,那我们就称它为 三阶 B 树。

一颗m阶的 B 树 要满足什么条件呢?

B树的查询过程和二叉排序树比较类似,从根节点依次比较每个节点,因为每个节点中的关键字和左右子树都是有序的,所以只要比较节点中的关键字,或者沿着指针就能很快地找到指定的关键字,如果查找失败,则会返回叶子节点,即空指针。

B树搜索的简单伪算法如下:

  1. BTree_Search(node, key) { 
  2.     if(node == null) return null; 
  3.     foreach(node.key) 
  4.     { 
  5.         if(node.key[i] == key) return node.data[i]; 
  6.             if(node.key[i] > key) return BTree_Search(point[i]->node); 
  7.     } 
  8.     return BTree_Search(point[i+1]->node); 
  9.  
  10. data = BTree_Search(root, my_key); 

这就是个伪算法,写的不好,大家见谅,那么什么是 B+ 树呢?

B+ 树是一种树数据结构,是一个n叉树,每个节点通常有多个孩子,一颗B+树包含根节点、内部节点和叶子节点。根节点可能是一个叶子节点,也可能是一个包含两个或两个以上孩子节点的节点。

B+ 树通常用于数据库和操作系统的文件系统中。

NTFS, ReiserFS, NSS, XFS, JFS, ReFS 和BFS等文件系统都在使用B+树作为元数据索引。

B+ 树的特点是能够保持数据稳定有序,其插入与修改拥有较稳定的对数时间复杂度。

B+ 树元素自底向上插入。

那 B+ 树又有哪些比较显著的特点呢?

B+树与B树差异

说到这里,就会有读者开始想,说了半天,没有说到重点,为什么加了索引就快呢?

刚才阿粉也说了,数据库读取数据,是从磁盘上通过 IO 来进行数据的操作,一次磁盘IO操作可以取出物理存储中相邻的一大片数据,如果查询的索引数据(就是B+树中从根节点一直到叶子节点整个过程中查询的节点数)都集中在该区域,那么只需要一次磁盘IO,否则就需要多次磁盘IO。

这么说是不是就相对的简单明了了。

再举出一个简单的例子:

比如我们想要查询 user 表中 name 为 xiaohong 的数据,在我们写 SQL 的时候

  1. select * from user where name = 'xiaohong' 

这时候没有索引的情况下,数据库直接就把整个表全部扫描一遍,然后去找 name = ‘xiaohong’ 的数据

而我们给他加上索引之后,会通过索引查找去查询名为 ‘xiaohong‘ 的数据,因为该索引已经按照字母顺序排列,因此要查找名为 ‘xiaohong' 的记录时会快很多。

大家明白了么?就像是一个词典,我把 x 开头的数据都给你罗列出来,然后你从 x 开头的数据中去寻找,和你直接没有任何处理,直接一页一页的翻词典的速度,哪一个更快,相信大家也都明白了吧。

 

来源:Java极客技术内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯