回答以下问题:
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的主键索引是聚集索引。
非聚集索引:
非聚集索引就是B+树的叶子节点的没有直接存储数据文件,而是存储数据文件的地址。
索引和数据文件是分开存储的。
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对
- innodb的底层是如何存储数据的?
- 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;
如果不是需要全表扫描的,可以用索引的就使用索引。
结论:使用哪一种方法对数据进行检索,存储引擎会自动判别并选择使用。