系统变量 table_cache, max_connections 和 max_tmp_tables 影响着服务器保持打开文件最大数量提高个或多个这些变量就可以提高操作系统在每次处理时能打开文件描述符限制很多操作系统都可以增加文件打开数量限制不过每个系统思路方法都各不样查阅下操作系统文档来判断是否可以提高限制以及如何去做
table_cache 和 max_connections 相关例如有200个并发连接那么则必须至少有 200 * N 大小表缓存CacheN 是在个表连接中最大表数量同时也需要为临时表和临时文件保留些额外文件描述符
请确认操作系统可以通过设定 table_cache 来处理对应数量打开文件如果 table_cache 设得太高了MySQL可能会用完全部文件描述符而拒绝新连接就无法执行查询变得很不可靠因此必须要考虑到 MyISAM 存储引擎要为每个独立打开表使用两个文件描述符可以在启动 mysqld_safe 时候增加 --open-files-limit 参数来提高MySQL打开文件描述符数量详情请看"A.2.17 File Not Found".
缓存Cache中会保存 table_cache 个打开表会它默认值是64;它可以在启动 mysqld 时候通过修改 --table_cache 参数来改变注意MySQL可能会临时打开比这个数更多表来执行查询
在以下情况中个不用表会被关闭并且从缓存Cache中被删除:
- 如果缓存Cache满了并且个线程试图打开个不在缓存Cache中表
- 如果缓存Cache中已经包含了不止 table_cache 个表目并且线程无需再使用该表
- 当发生刷新表操作当提交个FLUSH TABLES 语句或者执行 mysqladmin flush-tables or mysqladmin refresh 命令时就会这样
- 当表缓存Cache满了服务器遵循以下步骤来分配个新缓存Cache表目:
- 当前没使用表都释放依照最近最少使用顺序
- 如果有个新表要被打开但是缓存Cache满了且没有表被释放缓存Cache就临时根据需要扩充下
- 当缓存Cache处于临时扩充状态且有表处于从使用变成不使用状态时就关闭这个表并且从缓存Cache中释放
如果使用 HANDLER tbl_name OPEN 语句打开表则有个专用表对象给该线程这个表对象不和其他线程共享并且除非 HANDLER tbl_name CLOSE 语句或者线程结束否则它不会关闭;这样话它就重新放回表索引中(如果索引还未满)详情请看"14.1.3 HANDLER Syntax"
可以检查mysqld 状态变量 Opened_tables 来判断表索引是否太小了:
mysql>SHOWSTATUSLIKE'Opened_tables';
+---------------+-------+
|Variable_name|Value|
+---------------+-------+
|Opened_tables|2741|
+---------------+-------+
如果这个值比较大不过完全没必要执行大堆 FLUSH
TABLES 语句只需加大表索引缓存Cache大小即可
在些数据库中创建太多表缺点
如果在个目录下有很多 MyISAM 或 ISAM 表打开关闭创建等操作就会变慢如果在很多区别表上执行SELECT 语句当表缓存Cache满了的后这就会有些开销每个表都需要被打开其他必须关闭可以加大表缓存Cache来降低这个开销
最新评论