为什么Mongodb索引用B树,而Mysql用B 树?
  • 时间:2020-07-20

好久没写文章了,今日回来重操旧业。

今日讲的这个主题,是 《面试官:谈谈你对mysql索引的知道》 ,里头说到的一个坑。

也便是说,假如面试官问的是,为什么Mysql中Innodb的索引结构采纳B 树?这个问题时,给自己留一条后路,不要把B树喷的一文不值。因为网上有些答案是说,B树不适合做文件存储系统的索引结构。假如依照那种答法,自己就给自己挖了一个坑,很难收场。因而,就有了这篇文章的诞生~

文末附面试攻略!

这儿的Mysql指的是Innodb的存储引擎下的索引结构,其他存储引擎咱们暂时不评论。

最初,咱们先回想一下,B树和B 树的结构以及特色,如下所示:

B树

留意一下B树的两个显着特色

树内的每个节点都存储数据

叶子节点之间无指针相邻

B 树

留意一下B树的两个显着特色

数据只出现在叶子节点

一切叶子节点增加了一个链指针

针对上面的B 树和B树的特色,咱们做一个总结

B树的树内存储数据,因而查询单条数据的时分,B树的查询功率不固定,最好的状况是O。咱们可以以为在做单一数据查询的时分,运用B树均匀功能更好。可是,因为B树中各节点之间没有指针相邻,因而B树不适合做一些数据遍历操作。

B 树的数据只出现在叶子节点上,因而在查询单条数据的时分,查询速度十分安稳。因而,在做单一数据的查询上,其均匀功能并不如B树。可是,B 树的叶子节点上有指针进行相连,因而在做数据遍历的时分,只需求对叶子节点进行遍历即可,这个特性使得B 树十分适合做规模查询。

因而,咱们可以做一个推论:没准是Mysql中数据遍历操作比较多,所以用B 树作为索引结构。而Mongodb是做单一查询比较多,数据遍历操作比较少,所以用B树作为索引结构。

那么为什么Mysql做数据遍历操作多?而Mongodb做数据遍历操作少呢?

因为Mysql是联系型数据库,而Mongodb对错联系型数据。

那为什么联系型数据库,做数据遍历操作多?

而非联系型数据库,做数据遍历操作少呢?

咱们持续往下看

假定,咱们此刻有两个逻辑实体:学生和班级,这两个逻辑实体之间是一对多的联系。究竟一个班级有多个学生,一个学生只能归于一个班级。

联系型数据库

咱们在联系型数据库中,考虑的是用几张表来表明这二者之间的实体联系。常见的无外乎是,一对一联系,用一张表就行。一对多联系,用两张表。多对多联系,用三张表。

那这儿,咱们需求用两张表表明二者之间逻辑联系,如下所示

那咱们,此刻要查 cname 为 1班 的班级,有多少学生怎么办?

假定 cname 这列,咱们建了索引!

履行SQL,如下所示!

SELECT *
FROM t_student t1,  t2
WHERE t1.cid = t2.cid

而这,就触及到了数据遍历操作!

因为凡是做这种相关查询,你躲不开join操作的!已然触及到了join操作,无外乎从一个表中取一个数据,去另一个表中逐行匹配,假如索引结构是B 树,叶子节点上是有指针的,可以极大的进步这种一行一行的匹配速度!

有的人或许会抬杠说,假如我先履行

SELECT cid
FROM t_class
WHERE cname = '1班'

取得cid后,再去循环履行

SELECT *
FROM t_student
WHERE cid = ...

就可以避开join操作呀?

对此,我想说。你的确避开了join操作,可是你数据遍历操作仍是没避开。你仍是需求在student的这张表的叶子节点上,一遍又一遍的遍历!

那在非联系型数据库中,咱们怎么查询 cname 为 1班 的班级,有多少学生?

非联系型数据库

有人说,你可以这么规划?也便是弄两个调集如下所示

然后,履行两次查询去取得成果!一次去class调集查,取得id后再去student调集查。

的确,这么规划是可以的,我没说不可。仅仅不符合非联系型数据库的规划初衷。在MongoDB中,根本不引荐这么规划。尽管,Mongodb中有一个$lookup操作,可以做join查询。可是抱负状况下,这个$lookup操作应该不会常常运用,假如你需求常常运用它,那么你就运用了过错的数据存储了:假如你有相相关的数据,应该运用联系型数据库。

因而,正规的规划应该如下

假定 name 这列,咱们建了索引!

我只需履行一次句子

db.class.find

这样就能查询出自己想要的成果。

而这,便是一种单一数据查询!究竟你不需求去逐行匹配,不触及遍历操作,走运的状况下,有或许一次IO就可以得到你想要的成果。

因而,因为联系型数据库和非联系型数据的规划方法上的不同。导致在联系型数据中,遍历操作比较常见,因而选用B 树作为索引,比较适宜。而在非联系型数据库中,单一查询比较常见,因而选用B树作为索引,比较适宜。

现在套路有如下几种

你简历写了mysql,没写mongodb!

面试官: 说说mysql索引结构?

我: 巴拉巴拉

面试官: 知道为什么用B 树,不必B树么?

这个时分正常的面试者就蒙了,会把B树的缺陷喷一通!于是乎下一问便是

面试官: 其实一些非联系型数据库,如mongodb用的便是B树,你知道原因么?

然后你就回去等通知了!

你简历写了mysql,也写了mongodb!

这种状况更完美!

面试官: 说说mysql索引结构?

我: 巴拉巴拉

面试官: 你简历写了Mongodb,有了解过他的索引结构么?

我: 巴拉巴拉

面试官: 为什么Mongodb索引证B树,而Mysql用B 树?

然后你就回去等通知了!

你简历既没写mysql,没写mongodb!

面试官; 假如你来规划数据库,你会对他的索引证什么数据结构?

我: 首要不考虑红黑树这类,巴拉巴拉…应该会用B树或许B 树。

面试官;“假如我要规划一个像Mongodb那样的非联系型数据库,我要用什么数据结构当索引比较适宜?”

然后你就可以回去等通知了!

上面三个套路都是实在存在的!总归,只需面试官想问这个问题,都可以绕到这个问题上去!

其实这篇文章很早以前就想写,后来一向耽搁着。今日有时间刚好补上,期望我们有所收成。


客服QQ: 点击这里
地址: 客服QQ:
Copyby 2020 Power by DedeCms

服务时间:7X10小时