怎么样退出mysql 怎么样退出鹰眼护卫队( 二 )


table_open_cache:所有线程打开表的数目 。它的作用就是缓存表文件描述符,降低打开关闭表的频率,如果这个参数设置得过?。?就不得不关闭一些已打开的表以便为缓存新表,从而出现频繁的打开关闭MyISAM表文件的情况,而INNODB表的打开不受这个参数控制,而是放到其数据字典当中,即在ibd文件中 。当Opened_tables状态值较大,且不经常使用FLUSH TABLES 关闭并重新打开表,就需要增加该值 。
table_open_cache_instances:表缓存实例数 , 为通过减小会话间争用提高扩展性 , 表缓存会分区为table_open_cache/table_open_cache_instances大小的较小的缓存实例 。DML语句会话只需要锁定所在缓存实例,这样多个会话访问表缓存时就可提升性能(DDL语句仍会锁定整个缓存) 。默认该值为1 , 当16核以上可设置为8或16 。
table_definition_cache:缓存表定义(.frm)文件的数量 。如果表较多,可以增大该值加快打开表 。与一般表缓存不同,表定义缓存不占用文件描述符 , 占用空间也小 。最小为400,上线为2000,默认为:
400 + (table_open_cache / 2) 。如果打开表数量高于table_definition_cache,则会通过LRU机制搜索表空间LRU文件列表并刷新列表 。对于InnoDB , 打开文件的限制为max(table_definition_cache, innodb_open_files) 。
MySQL文件打开状态
mysql show global status like '%open%';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Com_ha_open | 0 |
| Com_show_open_tables | 1 |
| Innodb_num_open_files | 19 |
| Open_files | 3 |
| Open_streams | 0 |
| Open_table_definitions | 8 |
| Open_tables | 8 |
| Opened_files | 509 |
| Opened_table_definitions | 116 |
| Opened_tables | 90 |
| Slave_open_temp_tables | 0 |
| Table_open_cache_hits | 3254 |
| Table_open_cache_misses | 90 |
| Table_open_cache_overflows | 0 |
+----------------------------+-------+
14 rows in set (0.00 sec)
Open_table_definitions:代表当前缓存了多少.frm文件 。
Opened_table_definitions:代表自MySQL启动后,缓存了.frm文件的数量 。需要注意的是.frm文件是MySQL用于存放表结构的文件,
对应myisam和innodb存储引擎都必须有的,可以通过show open tables 查看 这2个变量的值 。
Open_tables:代表当前打开的表个数
Opened_tables:代表自MySQL启动后 , 打开过的表个数,如该值过大,可能是table_open_cache设置太小 。
Open_files:打开文件的个数 。服务器层打开的一般文件,不包含sockets 或 pipes类型文件,也不包含内部函数打开的文件 。
Opened_files:通过使用my_open()系统函数打开的文件数 。
Table_open_cache_hits:打开表缓存查找的命中数 。
Table_open_cache_misses:打开表缓存查找的未命中数 。
Table_open_cache_overflows:打开表缓存溢出数 。
MySQL如何打开关闭表
由于MySQL是多线程的 , 因此可能存在多个会话同时根据指定表进行查询 。为解决同一个表在不同会话状态不一致,该表会由每个会话独立的打开,这样MySQL会消耗内存但会提高性能 。
table_open_cache同时会跟max_connections相关 。如200个并发连接线程 , 指定的表缓存至少为200*N,N为每个连接关联的最大表数量 。
以下几种情况MySQL会关闭未使用的表并将其从表缓存中删除:
表缓存已满,线程将要打开不在缓存中的表 。
缓存中的表多于table_open_cache且缓存中的表不被任何线程使用 。
当发生表刷新操作(flush tables)
当表缓存满后,服务器将执行以下操作:
当前不使用的表将被释放,先释放最近最少使用的表

推荐阅读