mysql文件结构如下:

MySQL核心代码 mysql底层代码_MySQL核心代码

图上这些个文件都可以在文件目录中找到,下面我们来分析一波它们都是弄啥的。

  1. my.cnf 这个大家都晓得哇。
  2. show.log 记录慢查询日志,当语句执行时机超过参数long_query_times设置的值时,就会被记录到这个文件中,像是一些监控平台做sql统计都是查的这里面的数据。
  3. error.log 记录错误信息的。
  4. general.log 记录所有在数据库上执行的语句,文件增长很快,一般是在排查问题或者调试的的时候才开启。
  5. 系统默认库有4个,里面都是存储的元数据,比如表名、列名、属性等等的。

2、innodb文件结构

innodb存储引擎生成的表默认会生成三个文件,一个是用于存储表结构的.frm文件,一个是用于存储数据和索引的.ibd文件,一个是db.opt文件,这个里面主要是存储的mysql一些配置信息,比如编码、排序等等信息。

扩展点:

上面我们说了ibd是用来存储数据的,那么在计算机里面都是有最小存储单元的。磁盘的最小存储单元是扇区,一个扇区是512个字节,操作系统最小存储单元是块(block),一个块大小4k,innodb也有自己的最小存储单元,那就是页(page),一个页的大小为16k。也就是说上面提到的几个最小存储单元,即使你文件为空的那么也是有固定大小的呦。你可以去查一下,每个ibd文件,它永远是16384(16k)的整数倍。

上面这个划重点了哈,也就是即使你在mysql里面取一条数据,那么mysql也会取出16kb大小的数据。因为“页”是最小单位了嘛。因为这个点也和INNODB选择B+tree做索引结构有莫大的关系。

CheckPoint技术 

上面说的pool技术,那么它是怎么刷到磁盘的呢,比如你执行了一条DML语句,pool的页就变成了脏页,因为pool里面的数据要比磁盘上的数据要新,两者数据不一致。所以数据库需要按一定的规则将脏页刷到磁盘上,如果每次修改都刷盘,那这个pool基本意义也就不是很大了,开销会非常的大。再假如此时发生了宕机,此时还没来及刷新到磁盘上的pool岂不是都丢掉啦。

为了解决上面的问题mysql使用了WAL技术(write ahead log),也就是提交事务时,先顺序写到日志里面也就是redolog里面,然后再修改页。当发生故障时,通过redolog来进行数据的恢复。

综上可知Innodb的执行流程大概是酱紫的:

增删改时,首先顺序写入redolog(顺序写非常快),然后修改pool页(pool里面没有的插入insert buffer),然后各种线程按一定规则将数据刷到磁盘上,发生故障的话就使用redolog进行数据恢复。

checkpoint(检查点)刷盘时机:

1、缓冲池不够的时候,将脏页刷到磁盘。

2、 redolog不够用时,刷脏页到磁盘。

目前有两种检查点:

1、数据库关闭时,将所有脏页都刷到磁盘上面,这是默认的方式。

2、Master Thread操作,主线程会每隔1秒、每10秒将脏页以一定的比例刷到磁盘上,这个是 异步操作,不阻塞查询。

3、LRU列表空闲页不够时,刷新一部分来自LUR列表的脏页。

4、redolog文件不可用时,为了保证redolog循环利用,强制刷新一部分脏页到磁盘。

5、pool空间不足,,脏页过多,刷新一部分到磁盘。