diff --git a/mysql/mysql文档/innodb体系结构.md b/mysql/mysql文档/innodb体系结构.md new file mode 100644 index 0000000..c4d7907 --- /dev/null +++ b/mysql/mysql文档/innodb体系结构.md @@ -0,0 +1,68 @@ +# innodb体系结构 +## innodb体系结构 +innodb体系结构由如下部分构成 +- innodb存储引擎内存池 +- 后台线程 +- 磁盘上的文件数据 + +innodb内存池由多个内存块构成,内存快负责如下功能: +- 维护进程、线程访问的内部数据结构 +- 对磁盘上的文件数据进行缓存(加快读取速度),同时缓存对磁盘数据的修改 +- redo log缓冲 + +在innodb存储引擎中,后台线程主要负责刷新内存池中的数据,保证内存缓存为最新状态。此时后台线程还负责将内存池中的修改刷新到磁盘中。 + +## 后台线程 +innodb采用多线程模型,存在多个后台线程,每种后台线程负责不同的后台任务。 + +### Master Thread +Master Thread主要负责将内存池中的缓存数据异步刷新到磁盘中,包括脏页的刷新、合并`插入缓冲`(insert buffer),undo页的回收等。 + +### IO Thread +innodb中使用AIO来处理IO请求,IO Thread主要则用来处理异步IO的回调,其中`innodb_read_io_threads`和`innodb_write_io_threads`默认均为4个。 + +```sql +show variables like 'innodb_%_io_threads' +``` +|Variable_name|Value| +|-------------|-----| +|innodb_read_io_threads|4| +|innodb_write_io_threads|4| + + +### Purge Thread +当事务被提交之后,其对应的undo log不再会被需要,需要Purge Thread来回收已经使用的undo页。 + +可以设置多个purge threads,默认情况下,mysql 8的purge threads为4个: +```sql +show variables like 'innodb_purge_threads' +``` +|Variable_name|Value| +|-------------|-----| +|innodb_purge_threads|4| + + +### Page Cleaner Thread +page cleaner thread将脏页刷新的任务放到单线程中来完成,从而减轻原Master Thread的工作以及减少对用户查询线程的阻塞。 + +## 内存 +### 缓冲池 +innodb存储引擎是基于磁盘存储的,并将记录基于页的方式进行管理。为了提升数据库系统的读写性能,通常采用缓冲池来提升数据库的整体性能。 + +> ### 缓冲池原理 +> #### 读缓冲 +> 在数据库读取磁盘上的页面时,会将丛磁盘上读取到的页存放到缓冲池中,后续再读取相同的页数据时,先丛缓冲池中查找。如果缓冲池中存在该页,直接从缓冲池中读取。 +> #### 写缓冲 +> 在数据库针对磁盘上的页数据进行修改时,首先会尝试修改缓冲池中的页数据,并且,缓冲池中的页数据会定期刷新到磁盘中。 +> +> 缓冲池刷新页到磁盘中的操作,由checkpoint机制进行触发,并不会在每次更新缓冲池中的页数据后立马触发。 + +#### 缓冲池参数配置 +对于innodb,其缓冲池大小通过`innodb_buffer_pool_size`来配置。默认情况下,`innodb_buffer_pool_size`大小为128M. + +```sql +show variables like 'innodb_buffer_pool_size' +``` +|Variable_name|Value| +|-------------|-----| +|innodb_buffer_pool_size|134217728| diff --git a/mysql/mysql文档/锁.md b/mysql/mysql文档/锁.md index f3e24b5..b25e49b 100644 --- a/mysql/mysql文档/锁.md +++ b/mysql/mysql文档/锁.md @@ -1,3 +1,33 @@ +- [锁](#锁) + - [lock 和 latch](#lock-和-latch) + - [latch](#latch) + - [lock](#lock) + - [innodb中的锁](#innodb中的锁) + - [意向锁](#意向锁) + - [Record Lock](#record-lock) + - [一致性读](#一致性读) + - [一致性非锁定读](#一致性非锁定读) + - [一致性锁定读](#一致性锁定读) + - [Gap Lock](#gap-lock) + - [行锁算法](#行锁算法) + - [Next-Key Lock](#next-key-lock) + - [insert-intention lock](#insert-intention-lock) + - [加锁示例](#加锁示例) + - [performance\_schema.data\_locks](#performance_schemadata_locks) + - [select ... 加锁情况](#select--加锁情况) + - [select ... for update 加锁情况](#select--for-update-加锁情况) + - [select语句未命中索引](#select语句未命中索引) + - [select语句命中非unique索引](#select语句命中非unique索引) + - [select语句命中主键索引](#select语句命中主键索引) + - [update ... 加锁情况](#update--加锁情况) + - [update语句未命中索引的加锁情况](#update语句未命中索引的加锁情况) + - [update语句命中非unique索引](#update语句命中非unique索引) + - [update语句命中主键索引](#update语句命中主键索引) + - [innodb死锁](#innodb死锁) + - [超时](#超时) + - [wait-for graph](#wait-for-graph) + - [innodb锁升级](#innodb锁升级) + # 锁 ## lock 和 latch 在mysql数据库中,lock和latch都可以被称之为锁,但是两者锁包含意义不同。