MySQL:8.0全新的字典缓存(代替5.7 frm文件)

作者: admin 分类: 公众号存档            2 次浏览 发布时间: 2022-10-10 23:35

【转载声明】本文为转载文章,原作者「高鹏(八怪)」,版权归原作者所有。 原文链接:https://mp.weixin.qq.com/s/QykjZ85d0gkZrNXaqhNm2A

公众号:杨建荣的学习笔记 · 作者:高鹏(八怪) · 发布:2022-10-10 23:35:15 · 原文链接


水平有限仅供参考,仅供参考。


一、综述

在MySQL8.0中我们没有了frm文件,取而代之的是全新的字段缓存的设计和多个持久化的字典表,这部分不仅为原子性DDL提供了基础,而且减少打开物理frm文件的开销。但是原先的table/table_share的缓存依旧架设在前面。因此看起来在获取表的字典数据的时候就依次为:

  1. table_cache (大概率就命中了,参数相关,分多个实例,每个session只能用一个实例)

  2. table_define_cache(获取table share,命中率高,参数相关)

  3. Dictionary_client(字典元素)

  4. Shared_dictionary_cache(字典元素,命中率高,最大可缓存max connections个数的表字典信息)

  5. 持久化的表

而Dictionary_client和Shared_dictionary_cache和持久化的表就代替了原先的frm文件。这里先说一下flush tables语句,从debug来看并不影响 3和4的缓存。

二、Dictionary_client

Dictionary_client是一个session(THD)相关的,也就是session自己的,其中在Dictionary_client内包含一个重要的元素叫做Object_registry,其中包含了各种字典类型的map,如下:

  std::unique_ptr<Local_multi_map<Abstract_table>> m_abstract_table_map;
  std::unique_ptr<Local_multi_map<Charset>> m_charset_map;
  std::unique_ptr<Local_multi_map<Collation>> m_collation_map;
  std::unique_ptr<Local_multi_map<Column_statistics>> m_column_statistics_map;
  std::unique_ptr<Local_multi_map<Event>> m_event_map;
  std::unique_ptr<Local_multi_map<Resource_group>> m_resource_group_map;
  std::unique_ptr<Local_multi_map<Routine>> m_routine_map;
  std::unique_ptr<Local_multi_map<Schema>> m_schema_map;
  std::unique_ptr<Local_multi_map<Spatial_reference_system>>

每种类型的元数据都缓存在自己的map中,比如我们常说的Schema和Abstract_table,这里需要注意的是他们都是父类,比如

当然table还会更加复杂一些。具体的可以从父类Entity_object开始进行探索。但是需要注意的是这里是一个unique_ptr类型的智能指针,也就是说不能共享。

admin

杨建荣,《Oracle DBA工作笔记》《MySQL DBA工作笔记》作者,dbaplus社群发起人之一,腾讯云TVP,现任竞技世界系统部经理,拥有十多年数据库开发和运维经验,目前专注于开源技术、运维自动化和性能调优

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注