Mysql索引深刻理解

 

一.  引言mysql

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

二.  索引是什么?数据库

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

接下来咱们去看看索引究竟是如何高效获取数据的性能

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

id        name  spa

1         tom操作系统

2         jerryblog

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中,渐进复杂度是恒定不变的!!!

 重要的事说三遍

相关文章
相关标签/搜索