软件测试 | table_cache的设置
  p1prOQge3cDY 2023年11月02日 18 0

在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值有着更有价值的参考。

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

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

暂无评论

推荐阅读
  p1prOQge3cDY   2023年11月02日   19   0   0 缓存
  X7HGjGJ7MG9G   2023年11月02日   49   0   0 服务器缓存加载
p1prOQge3cDY
最新推荐 更多