面试 - 要不简单聊一下你对MySQL索引的理解?

转载自  面试 - 要不简单聊一下你对MySQL索引的理解?

MySQL索引?这玩意儿还能简单聊?明显是在挖坑,幸好老夫早有准备,切听我一一道来。

一、索引是什么?

索引是帮助MySQL高效获取数据的数据结构。

二、索引能干什么?

索引非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要。 索引能够轻易将查询性能提高好几个数量级,总的来说就是可以明显的提高查询效率。

三、索引的分类?

1、从存储结构上来划分:BTree索引(B-Tree或B+Tree索引),Hash索引,full-index全文索引,R-Tree索引。这里所描述的是索引存储时保存的形式,

2、从应用层次来分:普通索引,唯一索引,复合索引

3、根据中数据的物理顺序与键值的逻辑(索引)顺序关系:聚集索引,非聚集索引。

平时讲的索引类型一般是指在应用层次的划分。

就像手机分类:安卓手机,IOS手机 与 华为手机,苹果手机,OPPO手机一样。

普通索引:即一个索引只包含单个列,一个表可以有多个单列索引

唯一索引:索引列的值必须唯一,但允许有空值

复合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并

聚簇索引(聚集索引):并不是一种单独的索引类型,而是一种数据存储方式。具体细节取决于不同的实现,InnoDB的聚簇索引其实就是在同一个结构中保存了B-Tree索引(技术上来说是B+Tree)和数据行。

非聚簇索引:不是聚簇索引,就是非聚簇索引

四、索引的底层实现

mysql默认存储引擎innodb只显式支持B-Tree( 从技术上来说是B+Tree)索引,对于频繁访问的表,innodb会透明建立自适应hash索引,即在B树索引基础上建立hash索引,可以显著提高查找效率,对于客户端是透明的,不可控制的,隐式的。

不谈存储引擎,只讨论实现(抽象)

Hash索引

基于哈希表实现,只有精确匹配索引所有列的查询才有效,对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码(hash code),并且Hash索引将所有的哈希码存储在索引中,同时在索引表中保存指向每个数据行的指针。

面试 - 要不简单聊一下你对MySQL索引的理解?

B-Tree索引(MySQL使用B+Tree)

B-Tree能加快数据的访问速度,因为存储引擎不再需要进行全表扫描来获取数据,数据分布在各个节点之中。

面试 - 要不简单聊一下你对MySQL索引的理解?

B+Tree索引

是B-Tree的改进版本,同时也是数据库索引索引所采用的存储结构。数据都在叶子节点上,并且增加了顺序访问指针,每个叶子节点都指向相邻的叶子节点的地址。相比B-Tree来说,进行范围查找时只需要查找两个节点,进行遍历即可。而B-Tree需要获取所有节点,相比之下B+Tree效率更高。

面试 - 要不简单聊一下你对MySQL索引的理解?

结合存储引擎来讨论(一般默认使用B+Tree)

案例:假设有一张学生表,id为主键

idnamebirthday1Tom1996-01-012Jann1996-01-043Ray1996-01-084Michael1996-01-105Jack1996-01-136Steven1996-01-237Lily1996-01-25

在MyISAM引擎中的实现(二级索引也是这样实现的)

面试 - 要不简单聊一下你对MySQL索引的理解?

在InnoDB中的实现

面试 - 要不简单聊一下你对MySQL索引的理解?

面试 - 要不简单聊一下你对MySQL索引的理解?

五、为什么索引结构默认使用B+Tree,而不是Hash,二叉树,红黑树?

B+tree:因为B树不管叶子节点还是非叶子节点,都会保存数据,这样导致在非叶子节点中能保存的指针数量变少(有些资料也称为扇出),指针少的情况下要保存大量数据,只能增加树的高度,导致IO操作变多,查询性能变低;

Hash:虽然可以快速定位,但是没有顺序,IO复杂度高。

二叉树:树的高度不均匀,不能自平衡,查找效率跟数据有关(树的高度),并且IO代价高。

红黑树:树的高度随着数据量增加而增加,IO代价高。

六、为什么官方建议使用自增长主键作为索引?

结合B+Tree的特点,自增主键是连续的,在插入过程中尽量减少页分裂,即使要进行页分裂,也只会分裂很少一部分。并且能减少数据的移动,每次插入都是插入到最后。总之就是减少分裂和移动的频率。

插入连续的数据:

面试 - 要不简单聊一下你对MySQL索引的理解?

插入非连续的数据

面试 - 要不简单聊一下你对MySQL索引的理解?

面试 - 要不简单聊一下你对MySQL索引的理解?

七、简单总结下

1、MySQL使用B+Tree作为索引数据结构。 2、B+Tree在新增数据时,会根据索引指定列的值对旧的B+Tree做调整。 4、从物理存储结构上说,B-Tree和B+Tree都以页(4K)来划分节点的大小,但是由于B+Tree中中间节点不存储数据,因此B+Tree能够在同样大小的节点中,存储更多的key,提高查找效率。 5、影响MySQL查找性能的主要还是磁盘IO次数,大部分是磁头移动到指定磁道的时间花费。 6、MyISAM存储引擎下索引和数据存储是分离的,InnoDB索引和数据存储在一起。 7、InnoDB存储引擎下索引的实现,(辅助索引)全部是依赖于主索引建立的(辅助索引中叶子结点存储的并不是数据的地址,还是主索引的值,因此,所有依赖于辅助索引的都是先根据辅助索引查到主索引,再根据主索引查数据的地址)。 8、由于InnoDB索引的特性,因此如果主索引不是自增的(id作主键),那么每次插入新的数据,都很可能对B+Tree的主索引进行重整,影响性能。因此,尽量以自增id作为InnoDB的主索引。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323127.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ABP从入门到精通(4):使用基于JWT标准的Token访问WebApi

项目:asp.net zero 4.2.0 .net core(1.1) 版本 我们做项目的时候可能会遇到需要提供api给app调用,ABP动态生成的WebApi提供了方便的基于JWT标准的Token访问方式供我们访问API,不用在代码上做任何改动,很方便…

ASP.NET Core 2.0 + EF6 + Linux +MySql混搭

好消息!特好消息!同时使用ASP.NET Core 2.0和.NET Framework类库还能运行在linux上的方法来啦! 是的,你没有看错!ASP.NET Core 2.0,.NET Framework类库,linux通通都给你,不要998只要…

面试被问Mysql没答上来?阿里P5:总结了55道常见面试题,收藏一波

转载自 面试被问Mysql没答上来?阿里P5:总结了55道常见面试题,收藏一波 正文开始前,分享阿里 P8 高级架构师吐血总结的 《Java 核心知识体系&面试资料.pdf》, 非卖课程的哟! 阿里 P8 级高级架构师吐血总结的一份 Java 核心知…

开源纯C#工控网关+组态软件(四)上下位机通讯原理

一、 网关的功能:承上启下 最近有点忙,更新慢了。感谢园友们给予的支持,现在github上已经有。目标是最好的开源组态,看来又近一步^^ 之前有提到网关是物联网的关键环节,它的作用就是承上启下。 下位机有下位机的语言…

微软Tech Summit 2017,等你来打Call

2017年10月31至11月3日,由微软举办的Tech Summit 2017技术暨生态大会将在北京盛大举办,要在北京连开四天。今年的技术大会看头十足,不仅有大咖级人物带来十二大主题课程,更有三天四场的主题之夜。微软技术大会最早是由微软技术教育…

ABP从入门到精通(5):.扩展国际化语言资源

ABP的有些组件使用的该组件自带的语言包资源,所以在有些时候会因为我们当前使用的语言对应的语言包不全,而造成日志一直记录WARN。ABP给我们提供了扩展语言包资源的接口,可以解决这个问题。 以下示例代码适用于ABP .net core版本。我要为名为…

CoreCLR源码探索(八) JIT的工作原理(详解篇)

在上一篇 我们对CoreCLR中的JIT有了一个基础的了解,这一篇我们将更详细分析JIT的实现. JIT的实现代码主要在https://github.com/dotnet/coreclr/tree/master/src/jit下, 要对一个的函数的JIT过程进行详细分析, 最好的办法是查看JitDump. 查看JitDump需要自己编译一个Debug版本的…

【php】正则无法截取\反斜杠的解决方法

今天想将上次的图片上传功能优化一下,遇到一个问题,获取临时文件的名字时,由于名字中不能有\,所以必须对获取的文件名进行剪切,本人没有系统学习过php,所以有些知识点还是得重新学习。 获取到得字符串&…

学习Identity Server 4的预备知识

我要使用asp.net core 2.0 web api 搭建一个基础框架并立即应用于一个实际的项目中去.这里需要使用identity server 4 做单点登陆.下面就简单学习一下相关的预备知识. 基于Token的安全验证体系 这个比较简单, 简单来说就是为了证明我们有访问权限, 我们首先需要获得一个token. …

帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)

转载自 帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)   作为一名前端工程师,必须搞懂JS中的prototype、__proto__与constructor属性,相信很多初学者对这些属性存在许多困惑,容易把它们混淆&#xff…

【Php】最最简单的php环境搭建

Wamp是apachemysqlphp的集成环境,通过一键安装程序,可以完全免除配置的烦恼。 链接: 链接:https://pan.baidu.com/s/1717Mw66Z1wZ67ltLriUVew 提取码:7h5t 下载之后一直下一步,默认默认即可 如果输入local…

浅析C#中单点登录的原理和使用

是单点登录? 我想肯定有一部分人“望文生义”的认为单点登录就是一个用户只能在一处登录,其实这是错误的理解(我记得我第一次也是这么理解的)。 单点登录指的是多个子系统只需要登录一个,其他系统不需要登录了&#xf…

Mybatis入门程序增删改查操作

学习目标 了解Mybatis的基本知识熟悉Mybatis的工作原理掌握Mybatis入门程序的编写 文章目录 1.初始Mybatis 2.Mybatis入门程序 3.Mybatis操作总结 1.初始Mybatis MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所…

ASP.NET Core 2.0 全局配置项

问题 如何在 ASP.NET Core 2.0 应用程序中读取全局配置项? 答案 首先新建一个空项目,并添加两个配置文件: 1. appsettings.json { "Section1": { "SettingA": "ValueA", "SettingB": "V…

Auto.JS 教程

最近淘宝双十一活动来了,有个自动领猫币的脚本,基于auto.js,亲测有效。有兴趣的点这里 声明: 本教程基于b站up主-笔青居的视频。传送门:https://space.bilibili.com/21486893/video Auto.JS Auto.js 是个基于 JavaScri…

本土开源、立足全球 | COSCon'17

全球公有云 90% 的服务器运行的是开源 Linux 操作系统! GitHub 上有超过 150 万个组织,正在进行开源开发! 本土开源项目目前在 Apache 的顶级以及孵化列表中已经有 6 个! 你想知道这其中都有什么奥秘吗?Apache 顶级项目…

Wamp升级php到7.3版本

在网上找了关于cms的模板,结果显示php版本低于7.2的无法使用。 找了很多wamp和xampp的安装包,要不然版本没到7.2,要不然安装无法使用,浪费了很多时间 于是想自己手动把php升到7.3版本,刚开始看教程,特别麻烦…

浅析Entity Framework Core中的并发处理

前言 Entity Framework Core 2.0更新也已经有一段时间了,园子里也有不少的文章.. 本文主要是浅析一下Entity Framework Core的并发处理方式. 1.常见的并发处理策略 要了解如何处理并发,就要知道并发的一般处理策略 悲观并发策略 悲观并发策略,正如其名,它指的是对数据被外界&…

Mybatis的关联映射

学习目标 了解数据表之间以及对象之间的三种关联关系熟悉关联关系中的嵌套查询和嵌套结果掌握一对一、一对多和多对多关联映射的使用文章目录 1. 关联关系概述 2. 一对一 3.一对多 4. 多对多 1. 关联关系概述 一对一的关系:就是在本类中定义对方类型的对象一对…

【乱码】字符串乱码

1、html <meta charset"UTF-8">2、mysql mysql_query(set names "utf8");3、php header("Content-Type: application/json;charsetUTF-8");json解码 $a你好; echo json_encode($a);加入 $aurldecode($a);即可解码