引言

很久没写文章了,今天回来重操旧业。

今天讲的这个主题,是《面试官:谈谈你对mysql索引的认识》,里头提到的一个坑。mysql

也就是说,若是面试官问的是,为何Mysql中Innodb的索引结构采起B+树?这个问题时,给本身留一条后路,不要把B树喷的一文不值。由于网上有些答案是说,B树不适合作文件存储系统的索引结构。若是按照那种答法,本身就给本身挖了一个坑,很难收场。所以,就有了这篇文章的诞生~面试

文末附面试指南!sql

正文

这里的Mysql指的是Innodb的存储引擎下的索引结构,其余存储引擎咱们暂时不讨论。mongodb

B树和B+树

开头,咱们先回忆一下,B树和B+树的结构以及特色,以下所示:

B树

数据库

注意一下B树的两个明显特色

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

叶子节点之间无指针相邻ide

B+树

性能

注意一下B+树的两个明显特色mysql索引

数据只出如今叶子节点spa

全部叶子节点增长了一个链指针

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

(1)B树的树内存储数据,所以查询单条数据的时候,B树的查询效率不固定,最好的状况是O(1)。咱们能够认为在作单一数据查询的时候,使用B树平均性能更好。可是,因为B树中各节点之间没有指针相邻,所以B树不适合作一些数据遍历操做。

(2)B+树的数据只出如今叶子节点上,所以在查询单条数据的时候,查询速度很是稳定。所以,在作单一数据的查询上,其平均性能并不如B树。可是,B+树的叶子节点上有指针进行相连,所以在作数据遍历的时候,只须要对叶子节点进行遍历便可,这个特性使得B+树很是适合作范围查询。

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

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

由于Mysql是关系型数据库,而Mongodb是非关系型数据。

那为何关系型数据库,作数据遍历操做多?

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

咱们继续往下看

关系型VS非关系型

假设,咱们此时有两个逻辑实体:学生(Student)和班级(Class),这两个逻辑实体之间是一对多的关系。毕竟一个班级有多个学生,一个学生只能属于一个班级。

关系型数据库

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

那这里,咱们须要用两张表表示两者之间逻辑关系,以下所示

那咱们,此时要查

cname为

1班的班级,有多少学生怎么办?

假设

cname这列,咱们建了索引!

执行SQL,以下所示!

SELECT *

FROM t_student t1, (

SELECT cid

FROM t_class

WHERE cname = '1班'

) 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操做应该不会常用,若是你须要常用它,那么你就使用了错误的数据存储了(数据库):若是你有相关联的数据,应该使用关系型数据库(SQL)。

所以,正规的设计应该以下

假设

name这列,咱们建了索引!

我只需执行一次语句

db.class.find( { name: '1班' } )

这样就能查询出本身想要的结果。

而这,就是一种单一数据查询!毕竟你不须要去逐行匹配,不涉及遍历操做,幸运的状况下,有可能一次IO就可以获得你想要的结果。

所以,因为关系型数据库和非关系型数据的设计方式上的不一样。致使在关系型数据中,遍历操做比较常见,所以采用B+树做为索引,比较合适。而在非关系型数据库中,单一查询比较常见,所以采用B树做为索引,比较合适。

面试套路

目前套路有以下几种

套路一

你简历写了mysql,没写mongodb!

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

我:"巴拉巴拉"

面试官:"知道为何用B+树,不用B树么?"

这个时候正常的面试者就蒙了,会把B树的缺点喷一通!因而乎下一问就是

面试官:"其实一些非关系型数据库,如mongodb用的就是B树,你知道缘由么?"

而后你就回去等通知了!

套路二

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

这种状况更完美!

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

我:"巴拉巴拉"

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

我:"巴拉巴拉"

面试官:"为何Mongodb索引用B树,而Mysql用B+树?"

而后你就回去等通知了!

套路三

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

面试官;"若是你来设计数据库,你会对他的索引用什么数据结构?"

我:"首先不考虑红黑树这类,巴拉巴拉…应该会用B树或者B+树。"

面试官;“若是我要设计一个像Mongodb那样的非关系型数据库,我要用什么数据结构当索引比较合适?”

而后你就能够回去等通知了!

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

总结

其实这篇文章很早之前就想写,后来一直耽搁着。今天有时间恰好补上,但愿你们有所收获。

mysql mongodb b树_为何Mongodb索引用B树,而Mysql用B+树?相关推荐

  1. mysql b树_为什么 MongoDB 索引选择B树,而 Mysql 选择B+树(精干总结)

    这个问题是我在看视频的时候老师提到的,虽然之前知道他们各自的索引结构但是还没有研究过原因.在网上一搜答案特别多.但是都特别的啰嗦.于是总结了这篇文章. 一.B树和B+树的区别 很明显,我们要想弄清楚原 ...

  2. mongodb 搜索速度_初识 MongoDB 数据库

    初识 MongoDB 数据库 前言 Flask 基础框架在之前的三篇文章中写完了.想要学习 web 相关的同学可以自己回顾翻一下,相信看完了,你也可以写出来一个简单的小案例来炫耀一波! 说到 web ...

  3. mongodb存储数据_在MongoDB中存储分层数据

    mongodb存储数据 继续使用MongoDB进行 NoSQL之旅,我想谈一谈一个经常出现的特定用例:存储分层文档关系. MongoDB是很棒的文档数据存储,但是如果文档具有父子关系,该怎么办? 我们 ...

  4. 给服务器mongodb设置权限_认识 MongoDB

    大部分数据库都是 C/S 架构,服务端提供服务,操作时需要使用客户端. MongoDB 也是如此,需要启动服务端进程 mongod 提供服务,然后使用其自带的 mongo 命令行程序或者其它客户端与服 ...

  5. mysql datetime 默认值_老大让我整理下公司内部MySQL使用规范,分享给大家

    作者:白程序员的自习室 链接:https://www.studytime.xin/article/mysql-internal-specifications.html 最近涉及数据库相关操作较多,公司 ...

  6. mysql xp系统时间_【Mysql5.5 XP系统下载】mysql XP系统安装图解

    文件名:[Mysql5.5 XP系统下载]mysql XP系统安装图解 文件介绍: 步骤1:选择安装类型有3种安装类型:Typical(典型安装).Complete(完全安装)和Custom(定制安装 ...

  7. mysql访问类型最好的_【干货满满】最全的MySQL性能指南(一):选择最佳的数据类型...

    对于 MySQL 数据库来说,好的逻辑表和物理表的规划至关重要,我们需要根据查询语句来针对性地设计 Schema ,没有万能好用的 Schema.一个 denormalized 的 schema 可以 ...

  8. centos mysql导出数据库命令_在centos(linux)下用命令导出mysql数据库数据

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  9. linux按照mysql为何如此简单_手把手教你在Linux下安装MySQL

    在Linux操作系统下,安装MYSQL有两种方式:一种tar安装方式,另外一种是rpm安装方式.这两种安装方式有什么区别呢?尽管我们在Linux下常用tar来压缩/解压缩文件,但MYSQL的tar格式 ...

最新文章

  1. java同步锁synchronized_Java对象锁和类锁全面解析(多线程synchronized关键字)
  2. (转载)Linux 信号signal处理机制
  3. 约瑟夫环c语言计蒜客链表,约瑟夫环的故事 - osc_3n35hvex的个人空间 - OSCHINA - 中文开源技术交流社区...
  4. PyTorch随笔-1
  5. windows使用nginx实现网站负载均衡测试实例
  6. batchnorm pytorch_GitHub趋势榜第一:TensorFlow+PyTorch深度学习资源大汇总
  7. Skywalking部署常见问题以及注意事项
  8. 利用SQL查找表中的质数(prime number)和完全数(perfect number)以及几个有趣的SQL语句...
  9. 一纬度横直线等于多公里_必备 | 高中物理必修一、必修二知识点提纲,预习复习一次搞定!...
  10. Android 获取应用签名
  11. 百变鹏仔缤纷彩色文字广告位代码美化版
  12. 紫砂壶的起源 计算机操作题,紫砂壶的起源与历史发展你知道吗?
  13. 密集预测任务的多任务学习(Multi-Task Learning)研究综述 - 网络结构篇(上)
  14. Java中如何实现添加用户信息_如何通过Java客户端在Active Directory中创建新用户并将其添加到现有组...
  15. 第100章 SQL函数 NULLIF
  16. Mongodb 设置账号密码
  17. java swing 自动补全_扩展easyui的combobox组件的自动完成(autocomplete)
  18. android webdav服务,开发Android Webdav服务器
  19. 计算机的四个发展史教案,计算机发展史教案
  20. 用Python编写的五子棋程序1.0版

热门文章

  1. 疲劳驾驶样本集_谷歌AI最新3D数据集,1.5万张动图,让AR主宰你的生活
  2. 蜜蜂路线(洛谷P2437题题解,Java语言描述)
  3. 【Python】Matplotlib切割图片
  4. Python定时任务-schedule vs. Celery vs. APScheduler
  5. 操作系统和常用软件下载
  6. structs2拦截器详解
  7. 加载exe的PE信息并输出相关PE信息的一段c++代码
  8. DataTable,DataView和DataGrid中一些容易混淆的概念
  9. 将整张网页存成png图片
  10. FineBI For Excel插件:助力地产业务人员节省50%报表制作时间