一.  引言

Mysql 我们平常用的很多,了解的很多,今天别的不说,直接说mysql的底层是什么,说到底层,就想到数据结构,那么,mysql的数据结构是什么呢? 是B + tree 。那么数据库中的索引是什么呢?

二.  索引是什么?

数据库的目的是为了存储数据,那么索引的概念是什么呢? 最合理的解释,也是官方的解释就是:索引是帮助MySQL高效获取数据的数据结构。关键就是这个数据结构,什么目录的解释都是不合理的。

接下来我们去看看索引到底是如何高效获取数据的

先建一张student表简单的存放数据

id        name

1         tom

2         jerry

3         jack

回到很久之前,大家先设想一下,如果之前没有mysql这种RDBMS(关系数据库管理系统)时,这些表存放在哪里呢?肯定是存放在文件之中。

那么,执行一个简单的查询,如 select  *   from   student   where   id  =  1;

如果要执行逐条筛选的话会特别慢,比如要找到 id =100的,就要筛选100条数据,显然是不合理的,那么索引究竟是如何高效获取数据的。

文件系统

首先,我们先看一下我们电脑中的文件系统,数据库数据是如何保存在文件中的

文件系统重要包括柱面 、 磁道和扇区,这是一种比较原始的存储方式

        

如图所示,如果每次查询都要从头转到尾的检索,效率性能都会很低,那么如果我们将id 与这条数据在扇区的位置记录(address)的对应记录起来的话,每次可以直接找到数据的位置,那么速率则会大大加快,如同我们看书时的目录一样,不需要讲前面的所有内容都过一遍。如下图所示:

到现在为止,我们已经对索引的概念和实现方式有了基本的认识 ,现在我们要谈论两个概念,一般存在于操作系统中,一个是时间局部性原理,一个是空间局部性原理。

时间局部性原理(Temporal Locality):如果一个信息项正在被访问,那么在近期它很可能还会被再次访问。
程序循环、堆栈等是产生时间局部性的原因。
空间局部性原理(Spatial Locality):在最近的将来将用到的信息很可能与现在正在使用的信息在空间地址上是临近的。
 
时间局部性原理和空间局部性原理打个比方就相当于快递员送快递一样,一般一个快递员只负责一片区域快递的配送,这个是空间局部性原理,这些快递一般都要在2个小时内送完,这是时间局部性原理。
为什么在索引中要去引入这两个概念呢?因为用索引去查询时,存在这种局部性的概念,比如执行语句   select  *   from   student   where   id  =  1;可能会在5分钟内再次调用该语句,这样我们就可以把该查询放入内存中去,这就是时间局部性原理。我们执行了id = 1 ,可能还会去执行 id= 2,id =3 这些语句,那么我们就去把这些类似查询的扇面全部查询一次,这就是空间局部性原理 (送快递不会一次只拿一个快递)。大家先大概了解一下这两个概念,我们继续往下走。
 
 
三.  为什么Mysql数据库要用B + tree 这种数据结构呢?
首先我们要先申明一个概念,判断索引的标准是什么?是IO渐进复杂度(就是IO执行的次数)
平时我们存放数据的数据结构有很多种,有hash,有红黑树等等,那么为什么我们要舍弃这些常用的数据结构而去用B + tree呢?我们依次去分析
 
Hash  hash(id)
用hash这种方式存储效率很高,通过key和value可以很快的获取到对应的值,那为什么我们不去用呢?因为当执行select  *   from   student   where   id  >  1; 这种sql的时候,hash就显得苍白无力了
 
在各种树的数据结构中,为什么不用普通的二叉树,为什么不用红黑树,而要用B+tree呢?我们从国外的一个网站上去清楚直观的去看一下各种数据结构,就可以知道为什么要使用B+tree了。
二叉树:
 

渐进复杂度是递增的!!!

二叉树是线性增加的,而且每个节点只能放一个数据,每查询一个数据,都会从头到尾执行一次,如果查询一次算一个IO的话,查询第1万条数据就要执行1万次IO,显然是不合理的。

红黑树:

渐进复杂度是递增的!!!

虽然高度减少了,但是高度还是不可控的,IO执行次数还是过多

B + tree

 →       →      →    

在这里我们发现b+ tree的高度居然是不变的,大家看这些图,如果想查某一id 的值,只需要查两次,比如最后一张图,查id为1 的: 0003  ->  0002  ->0001 ,其余的也都是查两次,这样我们可以得到结论:

在B + Tree中,渐进复杂度是恒定不变的!!!

在B + Tree中,渐进复杂度是恒定不变的!!!

在B + Tree中,渐进复杂度是恒定不变的!!!

重要的事说三遍

 
 
 

Mysql索引深入理解的更多相关文章

  1. mysql索引相关理解

    1.索引是高效获取数据的数据结构, 2.唯一索引,索引值不重复unique create unique index 索引名 on 表名(字段) alter table 表名 add unique in ...

  2. 简单聊一下对MySQL索引的理解?

    一.索引是什么? 索引是帮助MySQL高效获取数据的数据结构. 二.索引能干什么? 索引非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要. 索引能够轻易将查询性能提高好几个数量级, ...

  3. 面试官:小伙子,你给我说一下你对MySQL索引的理解吧

    一.索引是什么? 索引是帮助MySQL高效获取数据的数据结构. 二.索引能干什么? 索引非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要.索引能够轻易将查询性能提高好几个数量级,总 ...

  4. [译] MYSQL索引最佳实践

    近日整理文档时发现多年前的这个文档还是蛮实用的,然后在网络搜索了一下并没有相关的译文,所以决定把它翻译过来,如有不当的地方请多包涵和指正.原文地址:https://www.percona.com/fi ...

  5. MySQL 索引最佳实践

    原文请关注 这里 这是 文章 的翻译,在翻译过程中,会对其中涉及到的语句加上一些个人理解以及 SQL 语句的执行,并进行特别的标注. 1. 你做了一个很棒的选择,因为: 对于普通开发者和 DBA,理解 ...

  6. 深入浅出Mysql索引优化专题分享|面试怪圈

    文章纲要 该文章结合18张手绘图例,21个SQL经典案例.近10000字,将Mysql索引优化经验予以总结,你可以根据纲要来决定是否继续阅读,完成这篇文章大概需要25-30分钟,相信你的坚持是不负时光 ...

  7. 理解MySQL——索引与优化

    转自:理解MySQL——索引与优化 写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存 ...

  8. mysql创建索引以及对索引的理解

    创建表的时候创建索引   创建索引是指在某个表的一列或多列上建立一个索引,以便提高对表的访问速度.创建索引有3种方式,这3种方式分别是创建表的时候创建索引.在已经存在的表上创建索引和使用ALTER T ...

  9. 深入理解mysql索引

    深入理解mysql索引 1 深入理解索引 1.1 索引基础理论知识: 1.2 B+树索引 1.3 哈希索引 1.4 理解B+树.哈希索引结构及区别: 1.5 理解常见索引的基本概念:主键索引.唯一索引 ...

随机推荐

  1. (已实践)PLSQL本地还原Oracle数据库dmp文件

    这个方法很烂,导致重装Oracle时候处处出现问题,不建议使用这个方法,除非你以后不再用Oracle这个软件了,这个方法很烂,再评论一下. 第一,启动服务,(如果数据库处于启动状态,那么略过这一步) ...

  2. 红帽学习笔记[RHCSA] 第四课[用户相关、破解root密码]

    第四课 关于Linux 的用户 用户分类: # UID 是用户ID ​ UID 0分配给超级用户(root) ​ UID 1-200 是一系列的 系统用户 静态分配给红帽的系统进程 ​ UID 201 ...

  3. Python中classmethod和staticmethod的区别

    学习python中经常会出现一些相近或者相似的语法模块等,需要对比分析才能加深记忆,熟练运用. staticmethod:静态方法 classmethod:类方法 在python中,静态方法和类方法都 ...

  4. 关于android工具链

    1 android sdk platform tools 同android platform交互的工具,包括adb.fastboot和systrace. 2 sdk build tools 用于bui ...

  5. 携程的 Dubbo 之路,值得学习!

    注:本篇文章整理自董艺荃在 Dubbo 社区开发者日上海站的演讲. 1.缘起 携程当初为什么要引入 Dubbo 呢?实际上从 2013 年底起,携程内主要使用的就是基于 HTTP 协议的 SOA 微服 ...

  6. The Frog's Games

    The Frog's Games Problem Description The annual Games in frogs' kingdom started again. The most famo ...

  7. ECCV2014 Accepted paper

    今天早上看到小伙伴们说ECCV2014结果出来了, 自己于是赶紧看了下, 感觉ECCV2014显著性的文章和以往的不太一样. 1.Salient Montages from Unconstrained ...

  8. Python性能分析工具Profile

    Python性能分析工具Profile 代码优化的前提是需要了解性能瓶颈在什么地方,程序运行的主要时间是消耗在哪里,对于比较复杂的代码可以借助一些工具来定位,python 内置了丰富的性能分析工具,如 ...

  9. 31. Next Permutation (JAVA)

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  10. 伟大的GIL

    GIL 首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念.就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代 ...