写点什么

软件测试 | table_cache 的设置

  • 2023-08-01
    北京
  • 本文字数:1364 字

    阅读完需:约 4 分钟

更多学习资料戳!!!

在 mysqld 中对 table_cache 参数的定义如下:

[zzx@localhost ~]$ mysqld --verbose --help|grep table_cache=  --table_cache=# The number of open tables for all threads.
复制代码

这个参数表示数据库用户打开表的缓存数量。每个连接进来,都会至少打开一个表缓存。因此,table_cache 与 max_connections 有关,例如,对于 200 个并行运行的连接,应该让表的缓存至少有 200xN,这里 N 是可以执行的查询的一个联接中表的最大数量。此外,还需要为临时表和文件保留一些额外的文件描述符。

可以通过检查 mysqld 的状态变量 open_tables 和 opend_tables 确定这个参数是否过小,这两个参数的区别是前者表示当前打开的表缓存数,如果执行 FLUSH TABLES 操作,则此系统会关闭一些当前没用使用的表缓存而使得此状态值减小;后者表示曾经打开的表缓存数,会一直进行累加,如果执行 FLUSH TABLES 操作,值不会减少。下面的例子验证了这个过程。

(1)首先清空表缓存,记录两个状态的值:

mysql> flush tables; Query OK, 0 rows affected (0.00 sec) mysql> show global status like 'open_tables';; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Open_tables | 0 | +---------------+-------+1 row in set (0.00 sec) ERROR: No query specified mysql> show global status like 'opened_tables';; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Opened_tables | 35 | +---------------+-------+ 1 row in set (0.00 sec) 
复制代码

(2)然后,执行一个 SQL,对表 t 进行查询:

mysql> select count(1) from t; +----------+ | count(1) | +----------+ | 5 | +----------+ 1 row in set (0.00 sec)
复制代码

(3)接着再查看这两个参数的值:

mysql> show global status like 'open_tables';; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Open_tables | 1 | +---------------+-------+ 1 row in set (0.00 sec) ERROR: No query specified mysql> show global status like 'opened_tables';; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Opened_tables | 36 | +---------------+-------+ 1 row in set (0.00 sec)
复制代码

(4)可以发现,两个参数值都因为对表 t 的查询而状态加 1。这时,再次执行刚才对表 t 的查询:

mysql> select count(1) from t; +----------+ | count(1) |+----------+ | 5 | +----------+ 1 row in set (0.00 sec) mysql> show global status like 'open_tables';; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Open_tables | 1 | +---------------+-------+ 1 row in set (0.00 sec) ERROR: No query specified mysql> show global status like 'opened_tables';; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Opened_tables | 36 | +---------------+-------+ 1 row in set (0.00 sec)
复制代码

(5)此时这两个参数的值并没有变化,因为表 t 的描述符已经在此连接中打开过一次,因此保存了表缓存中。因此,状态值“open_tables”对于设置 table_cache 值有着更有价值的参考。

用户头像

社区:ceshiren.com 微信:ceshiren2023 2022-08-29 加入

微信公众号:霍格沃兹测试开发 提供性能测试、自动化测试、测试开发等资料、实事更新一线互联网大厂测试岗位内推需求,共享测试行业动态及资讯,更可零距离接触众多业内大佬

评论

发布
暂无评论
软件测试 | table_cache的设置_测试_测吧(北京)科技有限公司_InfoQ写作社区