MySQL概览
原创2020/12/5...大约 2 分钟
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;注意
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本身提供的功能,一般称为归档日志。
二者区别:
- redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。
- redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”。
- redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。
两个参数:innodb_flush_log_at_trx_commit设置为1可以让每次事务提交后redo log都写到磁盘,sync_binlog设置为1让binlog每次都写到磁盘。
undo log
回滚日志