一、关于一个SQL的简单的工作过程
1、工作前提描述
1、启动MySQL,在内存中分配一个大空间innodb_buffer_pool(还有log_buffer)
2、多用户线程连接MySQL,从内存分配用户工作空间(其中排序空间)
3、磁盘上有数据库文件、ib_logfile、tmp目录、undo
2、SQL的简易流程
1、DQL操作
1、首先进行内存读
2、如果buffer pool中没有所需数据,就进行物理读
3、物理读数据读入buffer pool,再返回给用户工作空间
2、DML操作(例update)
1、内存读,然后进行物理读,读取所需修改的数据行
2、从磁盘调入undo页到buffer pool中
3、修改前的数据存入undo页里,产生redo
4、修改数据行(buffer pool中数据页成脏页),产生redo
5、生成的redo先是存于用户工作空间,择机拷入log_buffer中
6、log线程不断的将log_buffer中的记录写入redo logfile中
7、修改完所有数据行,提交事务,刻意再触发一下log线程
8、待log_buffer中的相关信息都写完,响应事务提交成功
至此,日志写入磁盘,内存脏块还在buffer pool中(后台周期写入磁盘,释放buffer pool空间)。
二、影响SQL执行性能的因素,及具体看方式
1、大量物理读
mysql>show global status like 'i%read%';
| Innodb_buffer_pool_reads | 647 |
| Innodb_data_read | 48402944 |
| Innodb_data_reads | 2996 |
| Innodb_pages_read | 2949 |
| Innodb_rows_read | 1002172 |
1、Innodb_buffer_pool_reads:物理读次数
2、Innodb_data_read:物理读数据字节量
3、Innodb_data_reads:物理读IO请求次数
4、Innodb_pages_read:物理读数据页数
5、Innodb_rows_read:物理读数据行数
2、Log写性能
mysql> show engine innodb status \G
---
LOG
---
Log sequence number 144064129 //已经生成的日志量(累计值)/单位:字节
Log flushed up to 144064129 //已经写入的日志量(累计值)
Pages flushed up to 144064129 //已经