文件
日志
错误日志
对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数据库执行更改的所有操作。作用于一下:
- 恢复,某些数据恢复需要binary log
- 复制,主从结构数据同步需要
- 审计,判断是否存在注入攻击
表结构定义文件
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中表根据主键顺序存放,如果表中无主键则根据一下顺序选择:
- 取非空唯一索引作为主键,多个则按照索引声明顺序选择。
- 自动创建一个6字节的指针
InnoDB逻辑存储结构
由大到小:表空间、段、区、页。
segment 段
- 主要有数据段、索引段、回滚短等。
- 数据段即B+树中叶子节点,索引段即非叶子节点。
extent 区
- 不管页的大小,每个区的大小固定1MB。
- 每个段开始时,先用32个页大小的碎片页存放数据,只有当这些页用完了才会申请分配一个区的磁盘。
page 页
- 默认大小为16KB,
innodb_page_size
可以修改其页大小。 - 主要类型:数据页、undo页、系统页、事物数据页、插入缓冲位图页、插入缓冲空闲列表页、未压缩的二进制大对象页和压缩的二进制大对象页
页结构
- File Header:记录页的一些头信息
- Page Header:记录数据页的状态信息
- Infimum和Supremum Record:为两个虚拟的行记录,前者记录该页最小还小的值,后者则记录最大还大的值
- User Record:实际存储行记录的内容
- Free Record:空闲空间
- Page Directory:记录在页中的相对位置,也称Slots(槽)或目录槽
- File Trailer:用来检测页是否已经完整写入磁盘,记录checksum值等。
分区表
分区的过程是将一个表或索引分解为多个更小的部分。Mysql只支持水平分区(按照行记录分配到不同物理文件),主要有一下几种:
- range分区:基于属于一个给定的连续区间的列值放入分区。
- list分区:list分区面向的是离散的值。
- hash分区:*自定义表达式的返回值进行分区
- key分区:mysql提供的哈希函数进行分区
用分区表要慎重!!!