MySql

一、什么是mysql

        mysql数据库是一款存放和管理数据的软件,他介于应用和数据之间,通过一些设计,将大量数据变成一张张excel的表格,为应用提供创建、读取、更新、删除等核心操作。


二、数据页是什么?

        mysql将数据组织成excel表的样子,excel表的数据在磁盘中是.xls后缀的文件,mysql的数据表也是类似的,在磁盘中是个.ibd后缀的文件,数据表越大,磁盘上的.ibd文件也就越大,直接读写一个大文件中的全部数据会很慢,所以mysql将一个个数据拆成一个个数据页。每页大小16KB,


三、索引是什么?

        数据页这么多,我们怎么知道该读取哪个数据页?好办!可以为每个数据页加入页号,再为每行数据加入序号,这个序号就是所谓的主键,按主键大小排序,将每页数据最小的主键序号和所在页的页号提取出来,放入到一个新生成的数据页中并且给数据页加入层级的概念,这样我们就可以通过上层数据页快速缩小查找范围。加速查找数据页的过程。

这样页和页之间看起来就像是一颗倒过来的树

这个能提升查找效率的树就是我们常说的B+树

      刚才提到的这个索引是按照主键来查找,所以叫做主键索引,而除了根据主键,我们还可以根据字段来查询,也就是辅助索引


四、Buffer Pool是什么?

       尽管有了数据页和索引这样能够提升效率的东西,但是数据在磁盘上,要查找磁盘,还是比较慢的。解决办法:没有什么是加一层中间层不能解决的问题。

       这次要加的是进程类缓存Buffer Pool,里头装的正是数据页和页号表。应用在读取数据的时候,会先去看Buffer Pool里头有没有需要的数据,如果有直接拿就好了,如果没有,那就再去访问磁盘,并且将这个数据放到Buffer Pool中,以便下次使用。

问题又来了:我们知道,文件读取,默认会先将磁盘中的数据加载到操作系统中的文件缓存当中去,那同样是缓存,为什么还要用Buffer Pool这个东西呢?

答:这是因为进程自己维护的Buffer Pool可以定制更多缓存策略,还能实现加锁的功能。

       正是因为有了Buffer Pool,就不需要操作系统的文件缓存了。所以Buffer Pool直接IO模式绕过操作系统的缓存机制,直接从磁盘里读写数据。


五、自适应哈希索引

       就算有了Buffer Pool,查询某条数据还是得用B+树索引。时间复杂度为O(lgN),可以有更高效的办法吗,有!查询时间复杂度为O(1)的哈希表进行优化,记录每个数据页的查询频率,对于热点数据页,我们以查询的值为key ,数据页地址为Value,构建Hash表

      当查询名字为小白的数据的语句经常被使用时,以小白的name为Key ,Value就是小白信息所在的数据页的地址。这个Hash表就是所谓的自适应哈希索引


六、Change Buffer是什么?

        有了上述的Buffer Pool和自适应哈希索引,大大的提高了读性能,有办法提高写性能吗?

有!大部分数据表除了主键索引外,我们还会加一些辅助索引。比如对用户名加一个辅助索引,

那对于这些数据表的写操作,更新完主键索引的数据页后,还需要更新辅助索引页,这样读取辅助索引页的磁盘IO必然少不了,为了解决这个问题,我们可以先将要写入的数据收集到一块内存里,等那天磁盘里的索引页正好被读入Buffer Pool中时再将写入数据应用到索引页中,通过这个方式减少大量的磁盘IO提升性能,这个将写操作收集起来的地方就叫Change Buffer 它其实是Buffer Pool的一部分。


七、Undo Log是什么?

        在数据库中有一个叫事务的概念,也就是让多行数据要么同时更新成功,要么同时更新失败,也就是所谓的原子性。为了实现这一点,我们写数据的时候,要知道原来的数据长什么样,方便与更新后的数据行进行回滚。因此就有了Undo Log。

     更新Buffer Pool中的数据时,会用旧数据生成Undo Log记录,存储在Buffer Pool中的特殊Undo Log内存页中,并且他还会随着Buffer Pool中的刷盘机制,不断地写入到磁盘的Undo Log文件中。


八、Redo Log是什么? 

        刚才提到的Buffer Pool,Undo Log其实都是内存,如果内存中的数据只写了一半到磁盘中,数据库进程就崩了,那一个事务里的多行数据就无法做到同时更新成功,怎么办呢?我们将事务中更新数据行的操作都写入到Redo Log Buffer 内存中,然后在提交事务时进行Redo Log刷盘,将数据固定化到redo log文件中,数据库崩溃重启后就能通过Redo Log File找到历史操作记录重做数据,保证了事务里的多行数据变更,要么都成功,要么都失败。

问:我有这个功夫更新Redo Log File,为什么不将buffer Pool里的数据写入到磁盘?

答:Redo Log File是顺序写入的,而buffer pool的数据是随机分散在磁盘中的,顺序写磁盘性能是随机写的几十倍。所以很多存储系统写数据时都会搞个日志来记录操作,方便服务重启后,进行数据对账,确保数据的一致性和完整性。


九、InnoDB是什么? 

刚才提到的那些共同组成了InnoDB存储引擎

 InnoDB存储引擎对外提供接口函数。我们写的一些sql语句也会变成InnoDB中的接口函数

例如查询,创建,两条Sql语句会调用这些接口函数来插入和创建表。

那这些Sql语句是是如何转成接口函数的呢?那就得提到Server层了

9.1:server层

第一步:server层会先与应用建立一条网络连接;

第二步:分析sql语句中是否含有语法错误;

第三步:判断用什么索引能够提升查找效率;

第四步:最后用一个执行器来调用存储引擎的接口函数。

 server层和存储引擎共同构建成了一个完整的数据库也就是MySql


十、binLog是什么? 

        听说过删库跑路不,为了防止数据库被删除带来的影响,server层会将历史上所有的变更操作来记录到磁盘中的日志文件中这个日志文件就是所谓的binLog,一旦误删表了,那就利用binlog来恢复数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值