本文主要总结下MysqL在8.0版本和性能相关的一些改动,随着新的小版本的发布,本文将不断进行更新,直到正式GA.
已更新版本
MysqL 8.0.0
MysqL 8.0.0
WL#9387: InnoDB: Group purging of rows by table ID
这个问题最早是facebook的工程师Domas报的一个bug,InnoDB使用多线程来进行Undo Purge操作,但分配undo的策略不太合理,直接轮询分配.这意味着如果从一张表上删除大量数据,这N个purge线程可能产生大量的索引锁冲突(例如索引页合并及重组织)
在WL#9387中,在parse undo log时,通过table_id进行分组存储,在分发时确保同一个table id的记录被分配给同一个线程.(参考函数 trx_purge_attach_undo_recs)
当然这也意味着合理的不会产生冲突的单表操作,无法利用到多线程purge了,也算是一个弊端.
WL#8423: InnoDB: Remove the buffer pool mutex
这个算是众望所归的改进了,由Percona贡献的补丁(bug#75534),主要是对InnoDB的buffer pool mutex这个大锁进行了拆分,降低锁冲突:NameDescbuf_pool_t::LRU_list_mutex用于保护LRU链表,例如从LRU链表上刷脏或驱逐Page
buf_pool_t::free_list_mutex保护free list及withdraw list(online resize)
buf_pool_t::zip_free_mutex保护zip_free数组,该数组用于维护对压缩表产生的非标准page size的内存维护,ref buf/buf0buddy.cc
buf_pool_t::zip_hash_mutex保护zip_hash,其中存储压缩页block
buf_pool_t::