设为首页收藏本站

UNIX技术社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
热搜: console
查看: 1924|回复: 0

跟进table_cache参数

[复制链接]
发表于 2011-12-11 18:42:44 | 显示全部楼层 |阅读模式
本帖最后由 sweat 于 2011-12-11 18:43 编辑

看了hiro对于table cache的介绍,我也进行了一些相关的操作,发现一个有趣的现象。
mysql> show open tables;
+———–+————————–+——–+————-+
| Database  | Table                    | In_use | Name_locked |
+———–+————————–+——–+————-+
| bbs       | sql_access               |      0 |           0 |
| bbs       | sql_caches               |      0 |           0 |
| bbs       | sql_ranks                  |      0 |           0 |
| bbs       | sql_modworks        |      0 |           0 |
| bbs       | sql_adminnotes      |      0 |           0 |
| bbs       | sql_imagetypes       |      0 |           0 |


| bbs       | sql_reportlog            |      0 |           0 |
| bbs       | sql_searchindex       |      0 |           0 |
+———–+————————–+——–+————-+
120 rows in set (0.00 sec)
mysql> show global status like ‘open_tables’;
+—————+——-+
| Variable_name | Value |
+—————+——-+
| Open_tables   | 124   |
+—————+——-+
1 row in set (0.00 sec)
不知道大家有没有发现,前者得到打开表的数量是120;后者却是124。为什么会有这样的不同呢?

mysql> flush tables;
Query OK, 0 rows affected (0.17 sec)
而我在flush tables之后两者的显示结果又得到相同的value,都是11。
mysql> show global status like ‘open_tables’;
+—————+——-+
| Variable_name | Value |
+—————+——-+
| Open_tables   | 11    |
+—————+——-+
1 row in set (0.00 sec)
mysql> show open tables;
+———–+————————–+——–+————-+
| Database  | Table                    | In_use | Name_locked |
+———–+————————–+——–+————-+
| wordpress | wp_postmeta              |      0 |           0 |
| wordpress | wp_wp_super_edit_options |      0 |           0 |
| wordpress | wp_terms                 |      0 |           0 |
| wordpress | wp_options               |      0 |           0 |
| wordpress | wp_wp_super_edit_plugins |      0 |           0 |
| wordpress | wp_links                 |      0 |           0 |
| wordpress | wp_usermeta              |      0 |           0 |
| wordpress | wp_term_taxonomy         |      0 |           0 |
| wordpress | wp_posts                 |      0 |           0 |
| wordpress | wp_users                 |      0 |           0 |
| wordpress | wp_term_relationships    |      0 |           0 |
+———–+————————–+——–+————-+
11 rows in set (0.00 sec)
table_cache表示数据库用户打开表的缓存数量。每个连接进来,都会至少打开一个表缓存;那是不是说有些连接会打开两个或多个,而使得两者的结果略有差别呢?还有就是,我们都知道MySQL是个多线程数据库,这样也就会发生有多个不同的用户同时对一个指定的表发出查询请求,这样也会增加open tables的数量,因为他们会各自独立的去使用自己的表缓存。
我们都知道open_tables表示当前打开的表缓存数,是个不稳定纪录,也就是说flush tables之后可以被清空;而opened_tables是一个牢固纪录,不会因此而影响,而是会不断的做有效累加。open_tables不能超过table_cach的上限,如果它变得很大或是增长太快,即便你还没有去执行flush tables这个语句,最好的办法是去增大table_cache的大小,因为有可能flush tables之后还是没有效果。
关于table_cache的设置,我们的原则是要清楚系统能够处理的由有table_cache所提供的打开文件描述符数量。如果它的值设置太大,MySQL可能会耗尽所有文件描述符,同时拒绝连接,使得执行查询失败;如果设置过于低,同样也会影响MySQL的性能。一般来说,我们会通过open_tables的值去衡量table_cache的大小是否能够满足查询需求;如果我们充足的内存,那么我们可以适当地去加大table_cache的值。
ulimit -a可以查看文件描述符。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表