最近做性能优化,发现Table Open Cache Hit Rati(命中率)只有42%,所以找了官方文档了解相关配置
查看当前open_tables使用情况
show global status like 'Open%tables';
其中 Open_tables
是当前打开表的数量,Opened_tables
是打开的文件数。如果Opened_tables
值非常大或快速增加,应该增大table_open_cache
的值
查看当前table_open_cache相关配置
show variables like '%open%';
其中第一个可以忽略,have_openssl
用于检查mysql数据库是否启用openssl,和我们要讨论的无关
innodb_open_files
指定InnoDB一次可以打开的最大文件数,默认值为300,如果指定了table_open_cache
且大于300则默认等于table_open_cache
open_files_limit
打开表数量限制,这个取决于系统可用文件符数量,不要大于ulimit -n
,避免无可用文件符导致报错。
配置建议:
- 10 + max_connections + (table_open_cache * 2)
- max_connections * 5
table_open_cache
mysql所有线程打开的表的数量
建议配置为 max_connections * N(一个连接使用的最大表数)
这个N不好估算,“按照JOIN表不推荐超过3个” 这个原则我们可以取=3
查看最大连接数 show variables like 'max_connections';
,
注意如果Opened_tables
在修改后持续仍然比Open_tables
大很多,可以调大table_open_cache
但是因为有了更多的缓存表,会占用更多系统内存和文件描述符,需要根据内存使用情况和文件描述符使用情况综合考虑
table_open_cache_instances
打开表的数量缓存实例,官方建议建议在使用16个或更多cpu内核的系统上使用8或16的值,但是我们一般没有这么豪华的配置,建议按照cpu的核数配置吧。
总结
合适的table_open_cache
可以使mysql性能更好,过小的配置会影响性能,但是过大也会导致其他问题出现,且不会增加性能。
同时各个配置直接有种相互关联的关系,也和系统配置有所关联,所以做配置修改时需要综合考虑。
更多详细内容可以看mysql 官方文档