不定时更新,我的mysql学习笔记
memeory引擎
- mysql默认使用memory存储引擎存储查询的中间结果,如果中间结果的大小大于了memory引擎的表容量,或者中间结果存在blob、text类型字段的时候,就会使用myisam存储引擎,将表放在磁盘中,性能会降低
archive引擎
archive引擎只支持insert和select操作,从mysql5.1开始支持索引。使用zlib算法压缩数据,比例达到10:1,所以很适合存储归档数据,如日志等
Innodb引擎
Innodb引擎是一个多线程的引擎,其中master线程是核心的后台线程。
master线程
主要负责将缓冲池的数据异步刷新到磁盘,保证数据一致性,包括脏页的刷新、合并和插入缓冲、ubdo页的回收。(和下面冲突,暂且这么记着,接着看书,然后更新)
IOthread
处理线程的回调
Purge Thread
用来回事务提交之后的undo日志,可以不止一个线程
page clear thread
将脏页的刷新放入单独的线程操作,减轻master线程的工作及对用户线程的阻塞
缓冲池
缓冲池缓冲的数据页类型有:索引页、数据页、undo页、插入缓冲、自适应哈希索引、innodb存储的索引新、数据字典信息。
一个数据库实例可以有多个缓冲池,减少内部资源竞争。
LRU LIST、Free List、Flush List
缓冲池使用LRU算法管理;数据库启动时,LRU列表是空的,数据页都在Free列表管理;LRU + Free的和可能不是数据库缓冲池的大小,因为缓冲池中海油自适应哈希索引和锁等页。
mysql LRU算法优化
mysql使用的LRU算法引入了midpoint的概念,新读取的页不会像朴素LRU算法一样放在LRU List的首部,而是放在LRU List的minpoint处,默认配置下,是LRU List的5/8处。minpoint之前是new列表,热端;之后是old列表。
为什么不使用朴素的LRU算法?
因为mysql中的某些操作可能会将缓冲池中的数据全部刷处缓冲区,如全表扫描。这种操作可能会将热点数据从LRU List中删除。
解决方法
引入innodb_old_blocks_time,表示页读取到mid位置后要等待多久才能到LRU的热端