对于 mysql,我有以下表:
[--] Data in MyISAM tables: 110M (Tables: 254)
[--] Data in InnoDB tables: 32M (Tables: 134)
[--] Data in MEMORY tables: 0B (Tables: 3)
但
[!!] Table cache hit rate: 19% (400 open / 2K opened)
我设置 400 作为表缓存,因为我的表少于 400 个。这如何工作,我应该怎么做?
答案1
MySQL 是多线程的,因此可能有许多客户端同时对给定表发出查询。为了最大限度地减少多个客户端会话对同一张表具有不同状态的问题,每个并发会话都会独立打开该表。
table_cache 与 max_connections 相关。例如,对于 200 个并发运行的连接,您应该至少拥有 200 × N 的表缓存大小,其中 N 是您执行的任何查询中每个连接的最大表数。您还必须为临时表和文件保留一些额外的文件描述符。
您可以通过检查 mysqld 状态变量 Opened_tables 来确定表缓存是否太小,该变量指示自服务器启动以来打开表的操作次数:
SHOW GLOBAL STATUS LIKE 'Opened_tables';
如果该值非常大或快速增加,即使您没有发出许多 FLUSH TABLES 语句,也应该增加表缓存大小。