javaweb
javaweb copied to clipboard
Mysql技术内幕(阅读笔记)
数据库:物理操作系统或其他形式文件类型集合。
实例:后台线程及一个共享内存组成。在系统表现上就是一个进程。
数据库和实例关系:一个数据库可能对应多个实例(集群),一个实例对应一个数据库。实例才是真正操作数据库文件的。
Mysql组成部分:
- 连接池组件
- 管理服务和工具组件
- SQL接口组件
- 查询分析器组件
- 优化器组件
- 缓存组件
- 插件式存储引擎
- 物理文件
InnoDB 体系结构
后台线程:
- Master Thread: 负责将缓冲池中数据异步刷新到磁盘,保证数据一致性,包括脏页的刷新、合并插入缓存(INSERT BUFFER)、UNDO页回收
- IO Thread: 使用AIO处理写请求
show VARIABLES like 'innodb_%io_threads'
innodb_read_io_threads 4
innodb_write_io_threads 4
show ENGINE innodb status;
可以观察io线程
3. purge Thread:
事务提交后,undolog不再需要,purge Thread回收undo页
show VARIABLES like 'innodb_purge_threads'
innodb_purge_threads 4
- purge Cleaner Thread: 刷新脏页
缓冲池: 数据库读页操作,首先将磁盘读到的页放入缓冲池,称为将FIX放在缓冲池中。下一次再读取相同页的时候,如果再缓冲池则命中读取。修改页也是先修改缓冲池中的页,然后再刷入磁盘(不是每次都刷,基于check point机制)
show VARIABLES like 'innodb_buffer_pool_size'
innodb_buffer_pool_size 134217728
缓冲池中缓存数据页有:索引页、数据页、undo页、插入缓冲、自适应哈希索引、InnoDB存储的锁信息、数据字典信息
缓冲区实例:
show VARIABLES like 'innodb_buffer_pool_instances'
innodb_buffer_pool_instances 1
存储引擎是基于表不是基于库
InnoDB存储引擎:行锁设计、支持外键、通过使用多版本并发控制(MVCC)获得高并发,提供了未提交读(Read uncommitted)、提交读(Read committed)、可重复读(Repeatable read)、可串行化(Serializable),默认REPEATABLE级别。使用next-key locking策略来避免幻读产生,还提供插入缓冲、二次写、自适应哈希索引、预读等高性能高可用功能。 InnoDB采用了聚集的方式,每张表存储顺序都是按主键顺序存放。没有指定主键的时候会默认生成一个6字节的RowId。
MyISAM引擎:不支持事务、表锁设计,支持全文索引。缓冲池只缓存索引文件,不缓存数据文件。由MYD(放数据文件)和MYI(放索引文件)组成
MVCC:
select * from table where ?; 不加锁 select * from table where ? lock in share mode; 共享锁 select * from table where ? for update; X锁 insert into table values (…); X锁 update table set ? where ?; X锁 delete from table where ?; X锁
一个Update操作的具体流程。当Update SQL被发给MySQL后,MySQL Server会根据where条件,读取第一条满足条件的记录,然后InnoDB引擎会将第一条记录返回,并加锁 (current read)。待MySQL Server收到这条加锁的记录之后,会再发起一个Update请求,更新这条记录。一条记录操作完成,再读取下一条记录,直至没有满足条件的记录为止。因此,Update操作内部,就包含了一个当前读。同理,Delete操作也一样。Insert操作会稍微有些不同,简单来说,就是Insert操作可能会触发Unique Key的冲突检查,也会进行一个当前读。
附录: