MYSQL存储引擎

回答以下问题:

MYSQL系统结构

MYSQL数据库存储和读取数据的过程

存储引擎是什么

存储引擎在哪里

存储引擎是怎么发挥工作的

索引是什么

索引存放在哪里

B,B+,hash只是数据结构,它们在哪里,这些数据结构用来做什么,

存储引擎,索引,B,B+,hash之间是什么关系

存储引擎的索引结构

解答:

MYSQL体系结构

注意:这一套结构只能称为MYSQL的体系结构,不能称为MYSQL数据库系统结构,因为这一套结构包括MYSQL软件系统和计算的硬件磁盘(文件等),只是MYSQL系统结合计算机磁盘形成的一套数据处理的系统 

各个部分的作用

MYSQL数据库存储和读取数据的过程

插入数据

系统读取数据进入内存缓冲区

MYSQL系统根据当前存储引擎定义的存储方式将数据存储进入磁盘

索引是什么

索引存放在哪里

B,B+,hash只是数据结构,它们在哪里,这些数据结构用来做什么,

什么是MYSQL的索引原理

索引原理又是什么

存储引擎是什么

本质上就是MYSQL底层的一套软件组件。(可编程实现)

存储引擎在哪里

在MYSQL系统中的一套软件

存储引擎的作用

数据是存储在磁盘上的,不是存储在存储引擎上的,那么存储引擎用来做什么;

作用:按特定方式存储数据进入磁盘和读取磁盘上的数据。

不同的存储引擎使用不同的方法存储和读取磁盘数据。

由MYSQL体系结构可知,存储引擎下一层就是就是计算机的磁盘,所以存储引擎就是直接指定数据存储以及读取方式的软件组件。

我们在MYSQL系统中编程输入create,insert等创建一些数据,但是这些知识命令,数据的创建是由存储引擎创建并保存进入磁盘的。而且不同的存储引擎支持的命令页各有不同之处。

系统从磁盘读取数据的方式:并不是需要什么数据,只读取什么数据,一次会读取一个磁盘块中的所有数据。

存储引擎是怎么发挥工作的

存储引擎的索引原理

就是存储引擎可以支持的使用哪一种数据结构来存储索引的值

存储引擎,索引,B,B+,hash之间是什么关系

存储引擎规定磁盘中用来存储索引值数据结构

存储引擎规定:索引值在磁盘中要怎么存储,才方便MYSQL系统运用。

索引

说一下什么是索引

就是将数据表的某一列或者多列的值按B+树的特性存储在B+数这种数据结构中所形成的结构。

索引的实质

以B+树的数据结构为存储数据的基础,以数据行的某个字段为键,将数据以键值对的形式存储在以B+树为存储形式的磁盘中,这个键就是索引的值。

聚集索引,非聚集索引,辅助索引

聚集索引:

聚集索引就是存储的数据(文件)就存储在B+树叶子节点的数据域。

索引和数据文件是一起存储的。

INNODB的主键索引是聚集索引。

InnoDB主索引

非聚集索引:

非聚集索引就是B+树的叶子节点的没有直接存储数据文件,而是存储数据文件的地址。

索引和数据文件是分开存储的。

MYISAM的主键索引是非聚集索引。

MyISAM主键索引

辅助索引

除了主键索引之外的其他类型的索引都是辅助索引,

比如普通索引,组合索引等。辅助索引属于非聚集索引(因为索引和数据文件分开存储了)。

主键索引必须有,即使程序员没有命令建立,存储引擎也会自动建立一个int类型6字节的主键索引。

 INNODB的辅助索引

INNODB的辅助索引的数据域存储的是主键索引的索引值。

索引INNODB的辅助索引查询数据必须先查询主键索引,再通过主键索引查询数据。

MYISAM的辅助索引

MYISAM的辅助索引和主键索引一样,叶子节点数据域存储数据文件的的地址。

MYISAM的辅助索引和主键索引是独立的。这就为什么MYISAM性能好,效率高的原因。

聚集索引和非聚集索引比较

1,聚集索引因为叶子节点存储的就是数据,所以查询快。而非聚集索引因为叶子节点数据域存储的是地址,所以需要二次查询。

INnodb

索引结构

B+树

为什么需要innodb这个存储引擎:

数据是存储在物理磁盘上的,而真正的数据处理又是在内存中执行的。由于磁盘的读写速度非常慢,如果每次操作都对磁盘进行频繁读写的话,那么性能一定非常差。为了上述问题,InnoDB将数据划分为若干页,以页作为磁盘与内存交互的基本单位,一般页的大小为16KB。这样的话,一次性至少读取1页数据到内存中或者将1页数据写入磁盘。通过减少内存与磁盘的交互次数,从而提升性能。

数据分页读写--------》减少内存和磁盘的交互次数

innodb的页

页是InnoDB管理磁盘存储空间的基本单位,也是最小单位,一个页的大小一般是16KB。

数据页中存放的是一行一行的记录

一个节点就是一页

计算:

eg:主键索引:

int主键值---4字节,MYSQL指针---8字节

一页即一个节点大小:12b

那么一页就可以存放键(主键值)值(指针)对:16*1024/12=1365对

  1. innodb的底层是如何存储数据的?
  2. innodb的作用(优点)

MYISAM

索引结构

B+树

存储引擎数据的读取原理

当需要查询数据时,索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。

索引结构

 大家在面试的时候,肯定都会被问到MySql的知识,以下是面试场景:
面试官:对于MySQL,你对他索引原理了解吗?
我:了解
面试官:MySQL的索引是用什么数据机构的?
我:B+树
面试官:为什么要用B+树,而不是B树?
我:…
面试官:用B+树作为MySql的索引结构,用什么好处?
我:…
原文链接

MYSQL中索引的数据结构有两种:B+树,hash.

大部分情况使用B+树,只是在查询单条数据是才选择性的使用哈希。

B树和B+树

RB-tree是平衡二叉搜索树

B和B+是平衡多叉搜索树,不再是平衡二叉搜索树

因为B和B+不一定只有子节点

B---balance

B树的特点

1,一个节点可以有多个子节点(多叉树)----作用:降低B树的高度,提高查找效率,

2,一个节点可以存放多个值,

3,B树因为节点中有键值,也有数据,所以存储的键值不会重复,

B+树的特点

1,B树有的B+树都有,

2,叶子节点之间也有路径连接起来(MYSQL中叶子节点的指针是双向的---为了可以向前和向后查询),

3,B+树内节点不存储数据,所有 data 存储在叶节点导致查询时间复杂度固定为 log n。

4,父节点存储的键值是子节点所有键值的边界值,利于查找,

MYSQL的B+树:

当使用索引字段进行查询时,从索引页开始快速检索

当不适用索引查询时,只能从数据页,一页一页的慢慢对比查询。

 B+树什么时候创建

当创建索引的时候

每次用字段创建索引,就会在磁盘中按指定的字段创建B+树。

MYSQL的索引为什么要用B+,不用红黑树或者B树

1,高度小:因为B+树一个节点可以有多个子节点,而红黑树是二叉树,这就导致相同数据时,B+树的高度比红黑树小,那么访问指定数据的就比红黑树块,效率高。

2,区间多:索引的效率依赖与磁盘 IO 的次数,快速索引需要有效的减少磁盘 IO 次数,如何快速索引呢?索引的原理其实是不断的缩小查找范围,达到快速查找的目的平衡二叉树是每次仅仅将范围分割为两个区间。为了更快,B-树每次将范围分割为多个区间,区间越多,定位数据越快越精确。那么如果节点为区间范围,每个节点就较大了。所以新建节点时,直接申请页大小的空间(磁盘存储单位是按 block 分的,一般为 512 Byte。磁盘 IO 一次读取若干个 block,我们称为一页,具体大小和操作系统有关,一般为 4 k,8 k或 16 k),计算机内存分配是按页对齐的,这样就实现了一个节点只需要一次 IO。
3,叶子节点连接使用预读原理:由于B+树的叶子节点的数据都是(使用链表)连接起来的,而且他们在磁盘里是顺序存储的,所以当读到某个值的时候,磁盘预读原理就会提前把这些数据都读进内存,使得范围查询和排序都很快.

4,节点索引多:B+树更适合外部存储。由于内节点不存储数据,只存储索引值,那么每个节点包含的索引就越多,能索引的范围更大更精确。

B-Tree每个节点中不仅包含数据的key值,还有数据。而每一个页的存储空间是有限的,如果data数据较大时将会导致每个节点(即一个页)能存储的key的数量很小(数据大,键少),当存储的数据量很大时同样会导致B-Tree的深度较大增大查询时的磁盘I/O次数,进而影响查询效率。

B树和B+树的区别

1,B+树内节点不存储数据,所有 data 存储在叶节点导致查询时间复杂度固定为 log n。而B-树查询时间复杂度不固定,与 key 在树中的位置有关,最好为O(1)。

2,查询时间复杂度:B树的由于每个节点都有key和data,所以查询的时候可能不需要O(logn)的复杂度,甚至最好的情况是O(1)就可以找到数据,而B+树由于只有叶子节点保存了data,所以必须经历O(logn)复杂度才能找到数据

3, B+树叶节点两两相连可大大增加区间访问性,

innodb的回表

组合索引的叶子节点的数据域存储的不是数据,而是主键索引,当通过组合索引寻找数据时,先通过组合索引找到对应的主键索引,在到主键索引里找数据。

看视频--视频

组合索引的使用

使用组合索引一定要遵循最左前缀原则

只要有最左字段,后面的组合字段有几个或者没有都可以利用组合索引,

最左前缀只是从索引页检索才需要满足最左前缀,即有筛选条件时,如where,

如果是select之后查询的字段有组合索引的字段,也会利用组合索引,而且不需要满足最左前缀原则。

order  by索引失效问题

eg:

select * from sc order by a;

原因:因为需要检索所有数据,所以没必要按索引检索,全表扫描最快。

select b from sc order by a;

如果不是需要全表扫描的,可以用索引的就使用索引。

结论:使用哪一种方法对数据进行检索,存储引擎会自动判别并选择使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值