InnoDB
1.支持行锁
2.支持外键
3.支持非锁定读
4.支持事物
5.MVCC支持高并发
聚族,所有数据都是按id顺序存放,因此按主键获取数据特别快,索引只存放id
缓冲池:可以设置多个缓冲池,每个页根据不同的哈希值分配到不同的缓冲池中,从而减少资源竞争,根据innodb_buffer_pool_instances参数设置,缓冲池是为了协调CPU与磁盘速度的鸿沟,页的操作首先都是在缓冲池中完成的。
1)LRU List,Free List,Flush List
缓冲池中的页默认大小为16KB,采用LRU算法来管理,最新访问的页,并不是插入到列表首部,而是根据配置值midpoint的位置来插入,默认是5/8位置,如果不采用这种方式,常见的索引扫描和数据扫描,将这些数据全部插入头部,会将热点数据移除缓冲池。
2)压缩页,原本16KB大小的页可以被分为8KB,4KB,2KB,1KB的页,通过unzip_LRU列表进行管理。通过伙伴算法管理。
3)脏页,在LRU列表中的数据被更改后,称为脏页,脏页既存在于LRU列表中,也存在于Flush列表中,两个互不影响
4)重做(redo)日志缓冲,默认8MB
5)额外内存
6.CheckPoint
事物采用Write Ahead log策略,既当事物提交时,先写重做日志(redo),再写数据页,发生宕机时通过重做日志来恢复数据。
CheckPoint技术是为了解决:1)缩短数据库恢复时间,直接从checkPoint点之后的重做日志恢复数据,2)将脏页刷回磁盘。3)重做日志不可用时,刷新脏页。
关键特性
1.插入缓冲(Insert Buffer),2.两次写,3.自适应哈希索引,4.异步IO,5.刷新邻近页
1.Insert Buffer(针对辅助非唯一索引)
聚集索引,直接插入数据页,一般主键都是递增,是顺序插入,速度很快,但是辅助索引就可能是随机插入,因此先判断索引页是否在缓冲池中,若在,则直接插入索引页,若不在,写入插入缓冲。再按照一定的频率和时机对插入缓冲和索引页进行合并,这时很可能将多个插入操作合并到一个操作中(因为在同一个索引页中),大大提升了效率。
需要满足两个条件:1)索引是辅助索引,2)索引不是唯一的
写密集情况下,Insert Buffer占用内存过大,默认最大可占缓冲区的1/2,可以配置
2)1.1.x版本带来了change buffer(针对辅助非唯一索引),可以对insert,delete,update操作都进行缓冲,它们分别是:Insert Buffer,Delete Buffer,Purge Buffer
通过 innodb_change_buffer_max_size 来控制大小,最大为50,默认25,既占用缓冲池的1/4
采用B+树实现
三种合并情况:该Insert 所对应的索引页被读入到缓冲池中,2)Insert Buffer BitMap 追踪到该辅助索引已无可用空间,3)Master Thread
2.两次写(数据库的可靠性)
对缓冲池中的脏页进行刷新时,并不先写磁盘,而是先将脏页复制到doublewrite buffer中,然后再分两次,每次1MB将doublewrite buffer写入到共享表空间的磁盘上,顺序写入,开销不是很大,最后再写数据文件(此时是离散写入)。
3.自适应哈希索引(Adaptive Hash Index,AHI)
4.异步IO
5.刷新邻近页
MyISAM
1.不支持事物
2.表锁
3.缓存只缓存索引,不缓存数据文件
NDB
1.集群
MEMORY
1.数据都储存在内存中,崩溃不可恢复,速度快
2.默认使用Hash索引
3.大小受内存限制,只支持表锁,并发性能差
4.不支持TEXT和BLOB字段,变长(varchar)都会按照定长(char)来储存,浪费内存
5.查询时中间表会使用MEMORY来储存,如果不满足4中的条件,则会使用MyISAM来储存
Archive
只支持INSERT和SELECT操作,5.1开始支持索引,会使用zlib算法对数据进行压缩,占用空间小
网友评论