mysqlserver体系结构
connector(连接者):不同语言与mysql的交互
connectpool(连接pool):连接池 管理缓冲用户的连接
sql interface:接受sql执行的接口。并返回执行结果
parse’:sql语句传递到解析器进行验证和解析。
optimizer:基于cbo的优化。
cache&&buffr:表和权限的缓存
plugin storage engine:引擎插件
Files && logs :数据文件
FS:和文件系统的交互
sql接口组件接受sql语句。将sql语句解析成数据结构。传递到后面步骤。查询优化器生成查询路径树选取最优的查询路径。调用引擎接口打开表 执行查询。检查是否有缓存记录。没有就继续往下执行 到磁盘中寻找数据。查到需要的数据之后 写入引擎缓存。(query cache被废弃) 返回数据。关闭表。关闭连接
innodb引擎体系结构
sql语句执行流程:
update为例:
update test set index=2 where id =1
1 在server层进行语法解析 解析成mysql认识的语法 查询什么表 什么字段 生成查询路径树 选择最优。
2 引擎层判断id=1 是否在buffer中。不在就读入 对记录lock
3 将index之前的值对应的pk trxid 写入undo segment
4 更改缓存页中的数据 并将更新记录和新生成的LSN写入LOG buffer中 更新完之后再缓冲池中这个页就是脏页。
5 在commit的时候 根据innodb_flush_log_at_trx_commit 设置。按照不同的设置 按照不同的方式将log buffer的记录更新到redo log中 然后写binlog 写完binlog 开始commit —>2pc binlog 同步之后就是binlog名和position写到redo log。在redo log写入 commit flag。完成commit trx .unlock
6 后台io线程选择时机将缓存中合适的脏页写入磁盘文件中.刷新的时候拷贝一份到double write buffer中。double write buffer 数据落盘之后 从缓冲中刷到文件中。
mysql 线程种类
16种
srv_master_thread io_ibuf_thread io_read_buffer io_write_thread io_log_thread io_log_thread srv_purge_thread
srv_lock_timeout_thread srv_error_monitor_thread page_ceaner_thread thread_timer_notifier main srv_monitor_thread srv_worker_thread buf_dumper_thread dict_stats_thread signal_handler
wait event check performance problem
打开performance_schema 的监控 通过加压 查看top 如果是%wa那就是io的问题。通过iostat %util列 100%说明io存在满负载情况。再从数据库层确定一下情况
select * from performance_schema.event_waits_current where event_name != 'idle' order by TIMER_WAIT desc;
当前session在mysql内部线程号
select sys.ps_thread_id(connection_id());
数据页分类
File Header,表示页的一些通用信息,占固定的38字节。
Page Header,表示数据页专有的一些信息,占固定的56个字节。
// 以下两个组成统称的用户已使用数据
Infimum + Supremum,两个虚拟的伪记录,分别表示页中的最小和最大记录,占固定的26个字节。
User Records:真实存储我们插入的记录的部分,大小不固定。
Free Space:页中尚未使用的部分,大小不确定。
Page Directory:页中的某些记录相对位置,也就是各个槽在页面中的地址偏移量,大小不固定,插入的记录越多,这个部分占用的空间越多。 File Trailer:用于检验页是否完整的部分,占用固定的8个字节。
版权声明:本文为博主原创文章,未经博主允许不得转载。
- 上一篇:Mysql QA
- 下一篇:Mysql Book阅读(二)




