Mysql体系结构
连接池、服务与工具管理、SQL接口、查询分析组件,优化器,缓存/缓冲、插入式引擎、物理文件。
Mysql 引擎
仅比较主流的MyISAM和InnoDB
InnoDB:
支持事务,外键,行级锁,支持裸设备(row disk)建立表空间,事务默认隔离级别为REAPTABLE,使用next-key lock算法来避免幻读(Phantom),提供插入缓冲(insert buffer),二次写(double write),自适应哈希索引(adaptive hash index),预读(read head)等。
不支持FullText索引,不保存具体行数。
表中的数据采用聚集(clustered)方式存储,即按主键顺序存放,若没有显示声明主键,则自动生成6字节的ROWID作为主键。
注:一张表只能有一个聚集索引,可以有多个非聚集索引。
MyISAM:
支持FullText索引;只缓存索引,不缓存数据
不支持事务,表锁
MyISAM适用于多读少写;Innodb适用于与事务,高并发。
附上一个比较:
MYSQL连接
使用TCP/IP套接字连接:mysql -h 192.168.0.1 -u rookie -p
则会连接ip为192.168.0.1下的mysql实例。rookie为用户名。
缓冲
innodb基于磁盘存储,降低io与cpu的差距,引入了缓冲池(一块内存区域)。
缓冲池主要包含:数据页,索引页,undo页,插入缓冲,锁信息,自适应哈希索引等。结构图如下:
现在的innodb引擎支持设置多个缓冲池,该字段为innodb_buffer_pool_instance默认为1。
CheckPoint技术
主要是用户在宕机时,快速恢复,不用重做所有的日志,只需恢复checkpoint后的日志进行恢复。
checkpoint的作用就是把脏页刷回磁盘。(脏页:即缓冲池中修改过的数据页)
两种刷回策略
Sharp CheckPoint:数据库关闭时全部刷回,默认开启。
Fuzzy CheckPoint:部分刷回。 fuzzy:毛茸茸的,模糊的。
innoDB关键特性
插入缓冲,两次写,自适应哈希索引,异步IO,刷新临界脏页。
这里只是简单介绍,如果有需要,可以去查看《MYSQL技术内幕 第2版》原书第2章第6小节。
插入缓存
使用条件:
索引是非聚集索引
索引不唯一
两次写
通过保存一个页的副本,在写入失效(如宕机)时,先重页的副本来恢复,再进行重做日志。提高数据页的可靠性。
自适应哈希索引(AHI:Adaptive Hash Index)
定义:自动观察,若建立哈希能提供性能,则建立哈希索引。
InnoDB会自动根据访问频率和模式为访问热点建立哈希索引。
异步IO
AIO作用可以进行IO Merge(IO合并),如访问页(end,start)为:(8,6),(8,7),(8,8)。这3次IO会合并为(8,6)一次IO。
刷新临近页
当刷新一个脏页时,会检测该页所在区(extent)的其他页。如果是脏页,也一起一并刷回。该字段为innodb_flush_neighbors。