当执行mysqladmin状态命令,你应该看到这样的东西:
正常运行时间:426运行线程:1个问题:11082重新加载:1个打开表:12
的打开表
如果您的桌子少于12张表,则12的值可能会有些令人费解。
MySQL是多线程的,因此可能有许多客户端同时向给定表发出查询。要最小化在同一表上具有不同状态的多个客户端会话的问题,每个并发会话都独立打开表。这使用额外的存储器,但通常会增加性能。和MyISAM
表格,每个客户端的数据文件都需要一个额外的文件描述符。(相比之下,索引文件描述符在所有会话之间共享。)
的table_open_cache.
和max_connections
系统变量会影响服务器保持打开的最大文件数。如果增加这些值中的一个或两个,则可能会抵消操作系统对开放文件描述符的每次流程数所施加的限制。许多操作系统允许您增加开放文件限制,尽管该方法因系统而异。请咨询操作系统文档以确定是否可以增加限制以及如何执行此操作。10bet官方网站
table_open_cache.
与之相关max_connections
。例如,对于200个并发运行连接,请指定至少的表缓存大小200 *
, 在哪里N
N
是您执行的任何查询中每个连接的最大表数。您还必须为临时表和文件保留一些额外的文件描述符。
确保您的操作系统可以处理所暗示的打开文件描述符的数量table_open_cache.
设置。如果table_open_cache.
如果设置太高,MySQL可能会耗尽文件描述符,并出现拒绝连接或无法执行查询等症状。
也考虑到了MyISAM
存储引擎需要为每个唯一的打开表提供两个文件描述符。要增加MySQL可用的文件描述符的数量,请设置open_files_limit.
系统变量。看到第b.3.2.16节“未找到文件和类似错误”。
打开表的缓存保持在级别table_open_cache.
参赛作品。服务器在启动时自动调整缓存大小。要明确设置大小,请设置table_open_cache.
启动时系统变量。MySQL可能会临时打开更多的表来执行查询,如本节稍后所述。
MySQL关闭未使用的表,并在以下情况下从表缓存中删除:
当缓存已满,线程试图打开不在缓存中的表时。
当缓存包含多于
table_open_cache.
缓存中的条目和表不再被任何线程使用。发生表刷新操作时。当有人发出
冲洗表
声明或执行mysqladmin flush-tables或者mysqladmin刷新命令。
当表缓存填满时,服务器使用以下过程找到要使用的缓存条目:
从最近使用的表开始,目前未使用的表将发布。
如果必须打开一个新表,但缓存已经满了,不能释放任何表,则根据需要临时扩展缓存。当缓存处于临时扩展状态,并且表从使用状态变为未使用状态时,该表将关闭并从缓存中释放。
一个MyISAM
表为每次并发访问打开。这意味着,如果两个线程访问同一个表,或者一个线程在同一个查询中访问表两次(例如,通过将表与自身连接),则该表需要被打开两次。每个并发打开都需要表缓存中的一个条目。第一个打开的MyISAM
表需要两个文件描述符:一个用于数据文件,一个用于索引文件。表的每次额外使用都只需要一个数据文件的文件描述符。索引文件描述符在所有线程中共享。
如果你打开一张桌子处理程序
语句时,为线程分配一个专用的表对象。这个表对象不被其他线程共享,并且直到线程调用时才关闭tbl_name.
开放处理程序
或者线程终止。当这种情况发生时,表被放回表缓存中(如果缓存没有满)。看到第13.2.4节,“HANDLER语句”。tbl_name.
关闭
要确定表缓存是否太小,请检查Opened_tables.
状态变量,指示自服务器启动以来的表打开操作的数量:
MySQL>显示“Opened_tables”等全局状态;+ -------------- + ------- + |变量_name |价值|+ -------------- + ------- + |Opened_tables |2741 |+ -------------- + ------- +
如果该值非常大或迅速增加,即使您没有发布许多冲洗表
语句,增加table_open_cache.
服务器启动时的值。