乐趣区

关于mysql:第47问Table-definition-cache-有什么作用

咱们在 第 12 问 中介绍了 table cache 的作用: 在同一个线程内,缩小了反复读取表定义的老本,包含读取表定义文件的 IO 老本,和 结构内存构造的 CPU 老本。(要留神 table cache 是线程级别的)

同时咱们发现了一个问题,即便没有命中 table cache,MySQL 也不肯定会从表定义文件中读取。

这就是因为命中了 table definition cache (之后咱们简称为 TDC),TDC 是全局级别的表定义缓存

本期咱们就来介绍一下 table definition cache 的作用

试验

咱们的试验办法与 第 12 问 雷同

结构一个数据库:

咱们将 TDC 设置为最小值 400:

当初应用 sysbench,来结构 500 张表:

当初应用 strace 监听 MySQL 的 IO 操作:

接下来咱们将逐个拜访方才造出来的 500 张表,咱们先须要生成一个脚本:

咱们从 information_schema 中,读取表名,并拼出相干的 SQL

当初就能够执行脚本了,咱们将方才生成的 SQL 通过管道符导入 MySQL client 进行执行:

察看 strace 的输入:

会发现 MySQL 在不停关上 frm 文件,来读取各个表的定义

咱们当初调大 TDC 的大小,再进行一次试验:

重做试验,咱们会发现 strace 没有新的输入:MySQL 不再重复读取 frm 文件

这就是 TDC 的作用:在全局级别建设一个缓存,用于缩小读取表定义的老本

思考题

此处咱们留一个思考题:

咱们将 TDC 设置为 400,在试验中咱们通过脚本拜访了 500 张表,这个试验能够重复进行。

但每次 strace 都会显示 MySQL 拜访了 500 个 frm 文件, 好像 TDC 并没有起作用一样.

请大家思考:这个景象是什么起因?

如果咱们在 MySQL 8.0 中,反复以上试验,会发现 MySQL 也不再读取 frm 文件。

这是因为 MySQL 8.0 引入了 Data Dictionary,将表定义放在了表中,不再须要拜访 frm 文件。

运维倡议

如果 TDC 溢出,并不会像 table_cache 溢出那样, 会有相干的状态量来显示 (table_open_cache_overflows).

为了不让 TDC 带来的益处隐没, 咱们倡议始终保持状态 Opened_table_definitions 小于 参数 table_definition_cache, 这样就能保障 TDC 始终命中。

而咱们付出的只有一点点内存的代价, 利大于弊。


对于 MySQL 的技术内容,你们还有什么想晓得的吗?连忙留言通知小编吧!

退出移动版