MySQL概览

MySQL内部组件

连接池

show processlist

用于查看连接

如果客户端长时间没有请求,连接池会自动断开链接,默认8小时,由参数wait_timeout控制。超时后报错:Lost connection to MySQL server during query

查询缓存

缓存以key-value形式缓存在内存中,key是查询语句,value是查询结果。

一般不建议使用查询缓存,表的更新会使缓存失效,且从业务上通常很少会有完全相同的sql(通常查询条件都会有区别)。

参数query_cache_type可以设置是否使用查询缓存,可选ON/OFF/DEMAND,可以配置为DEMAND,按需使用:

select SQL_CACHE * from T where ID=10;

WARNING

MySQL8.0中已经完全取消了查询缓存功能。

日志模块

redolog

是innodb引擎提供的功能。

当有数据更新时会记录redo log,引擎在适当的时候把更新写入磁盘。

redo log大小是固定的,且循环使用。有两个指针:write_pos指向当前写入记录的位置,一边写入一边后移,checkpoint指向当前要擦除的位置。write_pos和checkpoint之间的是剩余可写的部分,如果 write_pos 追上 checkpoint,这时候不能再执行新的更新,得停下来先擦掉一些记录,把 checkpoint 推进一下。

redo log使innodb引擎拥有crash-safe的能力。

binlog

是MySQL本身提供的功能,一般称为归档日志。

二者区别:

  1. redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。
  2. redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”。
  3. redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。

两个参数:innodb_flush_log_at_trx_commit设置为1可以让每次事务提交后redo log都写到磁盘,sync_binlog设置为1让binlog每次都写到磁盘。

undo log

回滚日志

参考资料

Last Updated 2024/11/25 02:50:15