MySQL深潜一文详解MySQ

北京皮炎医院哪个好 http://pf.39.net/bdfyy/bdfzj/210410/8833134.html
一背景在MySQL8.0之前,Server层和存储引擎(比如InnoDB)会各自保留一份元数据(schemaname,tabledefinition等),不仅在信息存储上有着重复冗余,而且可能存在两者之间存储的元数据不同步的现象。不同存储引擎之间(比如InnoDB和MyISAM)有着不同的元数据存储形式和位置(.FRM,.PAR,.OPT,.TRNand.TRGfiles),造成了元数据无法统一管理。此外,将元数据存放在不支持事务的表和文件中,使得DDL变更不会是原子的,crashrecovery也会成为一个问题。为了解决上述问题,MySQL在8.0中引入了datadictionary来进行Server层和不同引擎间统一的元数据管理,这些元数据都存储在InnoDB引擎的表中,自然的支持原子性,且Server层和引擎层共享一份元数据,不再存在不同步的问题。二整体架构datadictionary提供了统一的clientAPI供Server层和引擎层使用,包含对元数据访问的acquire()/drop()/store()/update()基本操作。底层实现了对InnoDB引擎存放的数据字典表的读写操作,包含开表(opentable)、构造主键、主键查找等过程。client和底层存储之间通过两级缓存来加速对元数据对象的内存访问,两级缓存都是基于hashmap实现的,一层缓存是local的,由每个client(每个线程对应一个client)独享;二级缓存是share的,为所有线程共享的全局缓存。下面我将对datadictionary的数据结构和实现架构做重点介绍,也会分享一个支持原子的DDL在datadictionary层面的实现过程。三metadata在内存和引擎层面的表示datadictionary(简称DD)中的数据结构是完全按照多态、接口/实现的形式来组织的,接口通过纯虚类来实现(比如表示一个表的Table),其实现类(Table_impl)为接口类的名字加_impl后缀。下面以Table_impl为例介绍一个表的元数据对象在DDcache中的表示。Table_implTable_impl类中包含一个表相关的元数据属性定义,比如下列最基本引擎类型、


转载请注明:http://www.aierlanlan.com/rzfs/288.html