table_open_cache - xiaoboluo768/qianjinliangfang GitHub Wiki
- 控制全局打开表数(注意是表的数据文件,且使用了文件描述符),通常是有多少个表,把表数量乘以两三倍就可以了(每一个sql执行线程至少需要打开一个缓存表,这个参数就是控制所有SQL执行线程可打开缓存表的数量,应该与最大连接数max_connections以及每个连接执行关联查询中所涉及表的最大个数(用N来表示)来设定:即,max_connections*N作为该参数的值)。table_definition_cache 变量和table_open_cache设置一样大(如果在show processlist里经常发现opening table 那么可能就是这两个变量设置小了(要注意,调整这两个变量的时候,也要注意系统open-files-limit的设置和innodb_open_files、open_files_limit变量),另外,状态变量Table_open_cache_hits和Table_open_cache_misses也可以观察到 ,这两个状态变量是5.6.x开始才有)。另外还有4个变量(5.6.x之前的版本可以使用下面4个变量查看):
- 默认值为2000,整型值。全局变量,动态变量,取值范围为1~524288
mysql> show status like 'Open%_table%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| Open_table_definitions | 512 |
| Open_tables | 512 |
| Opened_table_definitions | 51 |
| Opened_tables | 51 |
+--------------------------+-------+
4 rows in set (0.00 sec)
# Open_tables => opening #当前在table_open_cache中缓存着的表数量,当这个值接近table_open_cache时,就表示缓存数量已经被用完了,再有表打开时opend_tables变量就会增加
# Opened_tables => opened_total #实例启动以来,每次SQL查询都需要重新打开表,执行完后再把这个表关掉,而无法使用到table_open_cache的表数量
# 缓存机制
## 当 Mysql 访问一个表时,如果该表在缓存中已经被打开,则可以直接访问缓存;如果还没有被缓存,但是在 Mysql 表缓冲区中还有空间,那么这个表就被打开并放入表缓冲区;如果表缓存满了,则会按照一定的规则将当前未用的表释放,或者临时扩大表缓存来存放,使用表缓存的好处是可以更快速地访问表中的内容。
# 参数调优
## 一般来说,可以通过查看数据库运行峰值时间的状态值 Open_tables 和 Opened_tables ,判断是否需要增加 table_cache 的值(其中 open_tables 是当前打开的表的数量, Opened_tables 则是已经打开的表的数量)。即如果open_tables接近table_cache的时候,并且Opened_tables这个值在逐步增加,那就要考虑增加这个值的大小了。还有就是Table_locks_waited比较高的时候,也需要增加table_cache。
# 比较适合的值:
Open_tables / Opened_tables >= 0.85
Open_tables / table_cache <= 0.95
# 在mysql默认安装情况下,table_cache的值在2G内存以下的机器中的值默认时256到 512,如果机器有4G内存,则默认这个值是2048,但这决意味着机器内存越大,这个值应该越大,因为table_cache加大后,使得mysql对 SQL响应的速度更快了,不可避免的会产生更多的死锁(dead lock),这样反而使得数据库整个一套操作慢了下来,严重影响性能。所以平时维护中还是要根据库的实际情况去作出判断,找到最适合你维护的库的 table_cache值。
# 清空缓存
mysql >flush tables;
上一篇:lock_wait_timeout | 下一篇:table_definition_cache