《MySQL面试小抄》索引考点一面总结

我是肥哥,一名不专业的面试官!

我是囧囧,一名积极找工作的小菜鸟

囧囧表示:面试最怕的就是面试官问的知识点太笼统,自己无法快速定位到关键问题点!!!


本期主要面试考点

面试官考点之谈谈你对索引的理解?
面试官考点之解释一下计算机层面索引快的原因?
面试官考点之为什么不使用哈希结构作为索引结构?
面试官考点之为什么不使用二叉树作为索引结构?
面试官考点之为什么不使用B-Tree,而是B+Tree?
面试官考点之索引是加速查询,那么是否应该给表尽可能建立多的索引列?

索引小抄一面对话

面试官考点之谈谈你对索引的理解?

谈到索引,最先联想到的大概就是字典目录,根据MySQL官方定义,索引是用来帮助MySQL高效获取数据的一种数据结构。

本质上:索引是一种有序的快速查找的数据结构,用来快速高效的查找数据。

简单来说,可以类比字典目录,火车车次表。

面试官考点之解释一下计算机层面索引快的原因?

计算机从磁盘获取数据,加载到内存期间,一般都要经历3个常规的耗时过程

1、寻道(时间):确定要读的数据在哪个磁道耗费的时间
2、旋转延迟(时间):确定要读的数据在磁道上的哪个扇区耗费的时间
3、数据传输(时间):数据加载到内存耗费的时间

每次加载数据,我们称其为一次磁盘IO,每一次IO操作耗费时间 = 寻道 + 旋转延迟 + 数据传输(时间短暂,可以忽略不计)。

事实上实际加载数据到内存的时间非常短暂,一次IO操作主要的耗时来自寻道和旋转延迟。

总体来说,一般一次IO操作,耗时大概只有几ms。假如是4ms,虽然看起来很短暂,但是数据库百万级别的数据加载一遍,就需要4000s,对于一个系统来说,简直是毁灭级别的。

我们需要的就是减少磁盘IO的次数,这也是使用索引的意义所在!!!索引能够保证在亿级别的数据,只需要2~4次磁盘IO,这无疑是个福音!

面试官考点之为什么不使用哈希结构作为索引结构?

一般正常的业务场景中,通常查询多数是范围查询 类似:

select id, name, age from sys_user where age between 18 and 28;

哈希结构作为索引,那么存储引擎就会为每一行表记录计算出哈希值,哈希索引存储的就是HASH码;

HASH码直接随机生成,并没有规律

没有规律的HASH码,导致数据随机分布存储,这就导致即使是两个很相近的行记录,极大可能也会被分配到不同的桶(磁盘块)中。

最坏的情况下每查找一条记录,都要进行一次磁盘IO (可怕)。

优点,哈希结构这样key-val 键值对的形式对于精确查找非常敏感,对全值匹配很友好,所以单条记录查询效率非常高,时间复杂度为 1,但是我们日常业务来说,最常用的还是范围搜索,所以不哈希结构适合。

记住一点即可:Hash索引适合精确查找,全值匹配,不适合范围查找。

MySQL目前有Memory引擎和NDB引擎支持Hash索引。

面试官考点之为什么不使用二叉树作为索引结构?

首先观察一下二叉树结构

二叉树

二叉树最多有两个子节点,这种结构导致树的高度会很高,增加IO次数,特殊情况下可能化为链表结构,相当于全表扫描,全量磁盘IO。

假设二叉树结构作为索引,理想情况下是一颗完全二叉树,那么具有n个节点的完全二叉树深度为log2x+1

(其中x表示不大于n的最大整数)

如果一个数据在二叉树结构的100层,那么为了查找到此数据,需要进行100次磁盘IO。更糟糕情况下,二叉树会退化成链表结构,既,斜二叉树。

斜二叉树

类似的平衡二叉树,高度也很高。

面试官考点之为什么不使用B-Tree,而是B+Tree?

既然二叉树结构树高度很高,导致查询时磁盘IO增加,那B-Tree 呢?B-Tree可以存储更多的数据,高度更低,为什么不选择?而是B+Tree?

B-Tree是多路平衡搜索树,相比二叉树结构,可以极大的优化磁盘IO次数,但是B-Tree每个节点中不仅包含数据的key(索引值),还有data(整行记录),使用B-Tree结构,优点是找到索引就代表找到了数据记录。

既然如此为什么不使用B-Tree结构?还是老问题,磁盘IO数!!!

我们知道MySQL读取数据是以页为单位(磁盘块),每页(或者说每个磁盘块)的存储空间是有限的

如果data 很大,将会导致每页存储的索引数量很小

所以数据表存储的数据量很大的时候同样会导致 B-Tree的深度很大,增大查询时的磁盘I/O次数,进而影响查询效率。

再说到B+Tree,B+Tree是对B-Tree 的一种优化结构,使其更适合实现外存储索引结构

1、非叶子节点只存储键值信息(索引信息)

2、所有的数据记录都按照键值大小顺序存放在同一层的叶子节点上

好处:B+Tree的非叶子节点只存储键值信息,那么每一页能存储更多的索引,树的高度被压缩到很低,磁盘IO次数更小,一般情况下2~4次IO,即可查询到想要的记录。

而且因为表数据都是顺序存储在B+Tree结构的叶子节点,所以对于范围查找很友好,效率高!

面试官考点之索引是加速查询,那么是否应该给表尽可能建立多的索引列?

虽然索引的优势是加快查询效率,减少磁盘IO次数,但是盲目创建过多索引,大大增加了维护索引的时间成本和空间成本。

首先说一下索引的好处

1、减少IO次数,提高-检索效率

2、降低数据排序成本,可以减少CPU消耗

时间成本

因为索引是有序的快速查找结构,要维护索引的这个快速查找且有序特性,需要不断的进行调整,而调整就需要时间成本。

创建索引和维护索引要耗费时间,当对表中的数据进行增加、删除和修改的时候,索引也要动态地维护,这样就降低了数据的维护速度。

而且这种时间成本随着数据量的增加而增加!

空间成本

其次,每一个索引都是一棵B+Tree,保存索引和指向实体表的引用,需要占据空间。

如果建立的是聚簇索引,数据和主键都保存在索引文件中,则需要更大的空间成本。

随缘更新,整理不易,欢迎联系小白讨论,大神巴巴请绕路!

更多精彩内容,欢迎关注微信公众号:囧么肥事 (或搜索:jiongmefeishi)

阅读:

《MySQL面试小抄》索引考点二面总结

《MySQL面试小抄》索引考点一面总结

《MySQL面试小抄》索引考点一面总结的更多相关文章

  1. 《MySQL面试小抄》索引考点二面总结

    <MySQL面试小抄>索引考点二面总结 我是肥哥,一名不专业的面试官! 我是囧囧,一名积极找工作的小菜鸟! 囧囧表示:小白面试最怕的就是面试官问的知识点太笼统,自己无法快速定位到关键问题点 ...

  2. 《MySQL面试小抄》查询缓存机制终面

    <MySQL面试小抄>查询缓存机制终面 我是肥哥,一名不专业的面试官! 我是囧囧,一名积极找工作的小菜鸟! 囧囧表示:小白面试最怕的就是面试官问的知识点太笼统,自己无法快速定位到关键问题点 ...

  3. 《MySQL面试小抄》索引失效场景验证

    我是肥哥,一名不专业的面试官! 我是囧囧,一名积极找工作的小菜鸟! 囧囧表示:小白面试最怕的就是面试官问的知识点太笼统,自己无法快速定位到关键问题点!!! 本期主要面试考点 面试官考点之什么情况下会索 ...

  4. php面试专题---16、MySQL创建高性能索引考点

    php面试专题---16.MySQL创建高性能索引考点 一.总结 一句话总结: 注意:只写精品 1.索引的基础? 类似书籍的目录:索引类似于书籍的目录,要想找到一本书的某个特定主题,需要先查找书的目录 ...

  5. php面试专题---17、MySQL的SQL语句编写考点

    php面试专题---17.MySQL的SQL语句编写考点 一.总结 一句话总结: 注意:只写精品 1.MySQL的关联UPDATE语句? 关键UPDATE A,B:UPDATE A,B SET A.c ...

  6. 面试官:为什么Mysql中Innodb的索引结构采取B+树?

    前言 如果面试官问的是,为什么Mysql中Innodb的索引结构采取B+树?这个问题时,给自己留一条后路,不要把B树喷的一文不值.因为网上有些答案是说,B树不适合做文件存储系统的索引结构.如果按照那种 ...

  7. MySQL面试总结

    MySQL面试总结 # MySQL的存储引擎 `MyISAM`(默认表类型):非事务的存储引擎,基于传统的`ISAM`(有索引的顺序访问方法)类型,是存储记录和文件的标准方法,不是事务安全,不支持外键 ...

  8. [灵魂拷问]MySQL面试高频100问(工程师方向)

    作者:呼延十 juejin.im/post/5d351303f265da1bd30596f9 前言 本文主要受众为开发人员,所以不涉及到MySQL的服务部署等操作,且内容较多,大家准备好耐心和瓜子矿泉 ...

  9. [转帖]MySQL的又一神器-锁,MySQL面试必备

    MySQL的又一神器-锁,MySQL面试必备 https://segmentfault.com/a/1190000020762791 lock 低一级的是 latch   原文链接:blog.ouya ...

随机推荐

  1. Vue 批量注册局部组件及应用

    博客地址:https://ainyi.com/105 批量注册路由的有个博客说到:https://ainyi.com/77 实际工作中,可能会遇到一个大页面里面有很多个模块,这些模块一般是需要拆分到单 ...

  2. 『政善治』Postman工具 — 1、Postman介绍与安装

    目录 一.Postman介绍 二.Postman下载与安装 1.Postman下载 2.Postman安装 3.为什么要注册Postman账号 一.Postman介绍 Postman是一款非常流行的H ...

  3. linux下python调用.so文件

    前言 使用python 调用Fanuc的动态链路库.so 文件读取数据 环境要求 环境 需求 ubuntu16.04 32位 python3.5 32位 配置 把so文件添加到默认路径 ln -s / ...

  4. Android NDK工程的编译和链接以及使用gdb进行调试

    前提条件:已经安装了JDK 6.0.android SDK.NDK r9和eclipsele4.2开发环境. 推荐下载Android开发的综合套件adt-bundle-windows-x86,再下载A ...

  5. hdu1824 基础2sat

    题意: Let's go home Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...

  6. Android最新敲诈者病毒分析及解锁

    一.情况简介 从去年开始PC端的敲诈者类病毒在不断的爆发,今年年初的时候手机上也开始出现了敲诈者之类的病毒,对这类病毒很无语也是趋势,因为很多时候病毒的产生是和金钱利益相关的.前天去吾爱破解论坛病毒样 ...

  7. Win64 驱动内核编程-4.内核里操作字符串

    内核里操作字符串 字符串本质上就是一段内存,之所以和内存使用分开讲,是因为内核里的字符串太有花 样了,细数下来竟然有 4 种字符串!这四种字符串,分别是:CHAR*.WCHAR*.ANSI_STRIN ...

  8. Android开机时间分析

    http://blog.csdn.net/huangyabin001/article/details/42777703

  9. 【报错】org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'webSocketHandlerMapping' defined in class path resource

    环境:maven+eclipse+jdk1.8 [tomcat使用的是maven自带的插件,实质原因就是出在tomcat版本问题] 背景:在进行SSM集成WebSocket的时候,项目启动报org.s ...

  10. java 运用Cipher加密再解密后会变乱码。解决方案!

    同样的方法类用main调用加解密都正常,就是当用到业务就是加密后再解密变乱码. 后来发现同样的内容加密后的内容竟不相同. 经调试发现 encryptData.getBytes() 转为字节是的使用 C ...