Table Cache作用
  U21aNepNNgqM 2023年11月02日 48 0


技术社群的这篇文章《第12问:Table cache 有什么作用?》讲解了和table cache知识相关的实验,学习了解下。

相关历史文章,《小白学习MySQL - table_open_cache的作用》。

问题

我们都知道 MySQL 的 Table Cache 是表定义的缓存,江湖上流传着各种对这个参数的调优方法。我们通过实验来验证 Table Cache 的作用。

实验

我们先创建一个测试数据库,

Table Cache作用_缓存

建一张空表,

Table Cache作用_MySQL_02

建立一个连接,检查一下会话的初始状态,

Table Cache作用_缓存_03

在另一个窗口,开启 strace 追踪 MySQL 服务器的文件操作,

Table Cache作用_表结构_04

在 MySQL 中 select 新创建的表,

Table Cache作用_表结构_05

检查状态,

Table Cache作用_表结构_06

看到该操作没命中 table cache。

查看 strace,确实发现 mysqld 进程打开了表结构文件(test_tbl.frm),如果我们在 strace 中也抓获 read 事件(参数改为 "-e file,read"),那可以看到 mysqld 确实读取了表结构文件。

Table Cache作用_表结构_07

我们再次在该会话中进行 select,

Table Cache作用_MySQL_08

可以看到开始命中 table cache 了。在 strace 的输出中,也没有抓到新的文件操作。

可以看出 table cache 的作用,就是节约读取表结构文件的开销。

那不命中 table cache,一定会有读取表结构文件的开销么?

我们开一个新的会话,这里增加了一个标识来区分会话,

Table Cache作用_MySQL_09

在新会话中进行 select,查看状态,

Table Cache作用_MySQL_10

看起来确实 table cache 没有命中,也就是说 table cache 是针对于线程的,每个线程有自己的缓存,只缓存本线程的表结构定义。

不过我们发现,strace 中没有关于表结构文件的 open 操作(只有 stat 操作,定位表结构文件是否存在),也就是说 table cache 不命中,不一定需要读取表结构文件。

这种感觉好像是:在不命中 table cache 时,命中了另外一个表结构缓存。这个缓存就是之后我们会介绍的 table_definition_cache。

💡运维建议:

我们读一下 MySQL 的文档,关于 table_open_cache 的建议值公式:

建议值 = 最大并发数 * join 语句涉及的表的最大个数。

通过实验我们容易理解:table_cache 是针对于线程的,所以需要最大并发数个缓存。

另外,一个语句 join 涉及的表,需要同时在缓存中存在。所以最小的缓存大小,等于语句 join 涉及的表的最大个数。

将这两个数相乘,就得到了 MySQL 的建议值公式。

如果您认为这篇文章有些帮助,还请不吝点下文章末尾的"点赞"

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  xaeiTka4h8LY   2024年05月17日   38   0   0 MySQLgithub
  xaeiTka4h8LY   2024年05月17日   33   0   0 MySQL数据库
U21aNepNNgqM