一.  引言

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. kafka学习(六)

    用kafka构建数据管道   把kafka看着是一个数据的端点,怎么把kafka数据移到mysql,elasticSearchs 这里面介绍kafka connect API怎么样帮忙我们把数据移到我 ...

  2. python+selenium元素定位之XPath学习02

    XPath 语法 XPath 使用路径表达式来选取 XML 文档中的节点或节点集.节点是通过沿着路径 (path) 或者步 (steps) 来选取的. XML 实例文档 我们将在下面的例子中使用这个 ...

  3. CentOS7使用集群同步脚本对配置文件同步分发

    1.介绍 使用集群同步脚本对配置文件同步分发 2.操作 1)在/root目录下创建bin目录,并在bin目录下创建文件xsync,文件内容如下: [root@hadoop101 ~]$ mkdir b ...

  4. catch that cow POJ 3278 搜索

    catch that cow POJ 3278 搜索 题意 原题链接 john想要抓到那只牛,John和牛的位置在数轴上表示为n和k,john有三种移动方式:1. 向前移动一个单位,2. 向后移动一个 ...

  5. linux中断处理上下部分

    一.linux中断处理为什么要分为上下部 1.1. 中断处理的上半部(top half,又叫顶半部)和处理的下半部(bottom half,又叫底半部) 1.1. linux中断处理不参与调度,故中断 ...

  6. [BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块)

    [BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块) 题面 求 \[\sum_{i=1}^{n} \sum_{j=1}^{m} \mathrm{lcm}(i,j)\] 分析 \[\su ...

  7. div绝对定位居中

    绝对定位absolute,left:50%,加上margin-left:-(宽度/2),可以实现绝对位置居中 .list{ width: 1200px; height: 300px; overflow ...

  8. golang 一个字符串表达式替换的函数

    package util import ( "fmt" "reflect" "regexp" "strconv" &qu ...

  9. A广搜

    <span style="color:#330099;">/* A - 广搜 基础 Time Limit:2000MS Memory Limit:65536KB 64b ...

  10. 【源码解读】cycleGAN(二) :训练

    源码地址:https://github.com/aitorzip/PyTorch-CycleGAN 训练的代码见于train.py,首先定义好网络,两个生成器A2B, B2A和两个判别器A, B,以及 ...