《Mysql技术内幕,Innodb存储引擎》——文件、表

时间:2022-04-28 01:21:03

文件

日志

错误日志

对Mysql启动、运行和关闭过程进行记录,通过SHOW VARIABLES LIKE 'log_error'查看日志文件位置。

慢查询日志

  • Mysql启动时设置一个阈值,运行时间超过的所有SQL语句将记录到该日志。
  • long_query_time设置时间阈值,log_queries_not_using_indexes如果运行的SQL没使用索引则也记录慢查询日志,log_throttle_queries_not_using_indexes表示每分钟允许记录到日志的SQL语句次数。

二进制日志

binary log记录对Mysql数据库执行更改的所有操作。作用于一下:

  1. 恢复,某些数据恢复需要binary log
  2. 复制,主从结构数据同步需要
  3. 审计,判断是否存在注入攻击

表结构定义文件

Mysql是插件式存储引擎的体系结构,数据的存储是根据表进行的,因此每个表都会有对应的文件。其文件以frm后缀名。

InnoDB存储引擎文件

表空间

innodb将数据存储在表空间,默认会创建一个10MB的ibdata1的文件作为表空间。innodb_data_file_path设置文件,可同时设置多个并设置大小。innodb_file_per_table设置了则使每张表产生一个独立的表空间。

如果启用了innodb_file_per_table,每张表的表空间只是数据、索引和插入缓冲Bitmap页,其他类数据还是在共享表空间内。

redo log
  • 每个Innodb至少有1个redo log组,每个组下至少有2个redo log (默认为ib_logfile0和ib_logfile1)。
  • 日志组中每个日志文件大小一样,并循环写入。

索引组织表

Innodb中表根据主键顺序存放,如果表中无主键则根据一下顺序选择:

  1. 取非空唯一索引作为主键,多个则按照索引声明顺序选择。
  2. 自动创建一个6字节的指针

InnoDB逻辑存储结构

由大到小:表空间、段、区、页。

segment 段

  • 主要有数据段、索引段、回滚短等。
  • 数据段即B+树中叶子节点,索引段即非叶子节点。

extent 区

  • 不管页的大小,每个区的大小固定1MB。
  • 每个段开始时,先用32个页大小的碎片页存放数据,只有当这些页用完了才会申请分配一个区的磁盘。

page 页

  • 默认大小为16KB,innodb_page_size可以修改其页大小。
  • 主要类型:数据页、undo页、系统页、事物数据页、插入缓冲位图页、插入缓冲空闲列表页、未压缩的二进制大对象页和压缩的二进制大对象页

页结构

  1. File Header:记录页的一些头信息
  2. Page Header:记录数据页的状态信息
  3. Infimum和Supremum Record:为两个虚拟的行记录,前者记录该页最小还小的值,后者则记录最大还大的值
  4. User Record:实际存储行记录的内容
  5. Free Record:空闲空间
  6. Page Directory:记录在页中的相对位置,也称Slots(槽)或目录槽
  7. File Trailer:用来检测页是否已经完整写入磁盘,记录checksum值等。

分区表

分区的过程是将一个表或索引分解为多个更小的部分。Mysql只支持水平分区(按照行记录分配到不同物理文件),主要有一下几种:

  1. range分区:基于属于一个给定的连续区间的列值放入分区。
  2. list分区:list分区面向的是离散的值。
  3. hash分区:*自定义表达式的返回值进行分区
  4. key分区:mysql提供的哈希函数进行分区

用分区表要慎重!!!