暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL性能优化之table cache

写程序的猫 2020-07-11
1511
table cache是MySQL中的一个缓冲区域,用来缓存MySQL在运行期间打开的表,提升MySQL的性能。
MySQL是多线程的,每一个客户端都可能同时向服务端的同一个表执行多个查询,为了解决多个客户端在同一个表上有不同状态的问题,每一个会话都会单独打开表,这中做法使用了更多的内存但是提升MySQL的性能。对于MyISAM表,每个线程还会为数据文件使用一个额外的文件描述符(索引不需要,在所有会话中共享)。
table_open_cache和max_connections两个系统变量影响了服务器能够打开的最大文件数,增加这两个参数的值,可能会遇到操作系统对每个进程能够打开文件描述符个数的限制,可以通过修改修改操作系统的文件限制来解决。table_open_cache的值和max_connections有关,例如,200个并发运行的连接,指定的table_open_cache的值至少是200*N,其中N是所有连接中每个连接查询表的最大数量,同时还需要为临时表和文件预留额外的文件描述符。在设置table_open_cache时,要确保系统可以处理打开的文件描述符的数量,如果table_open_cache太大,MySQL可能会用尽文件描述符,出现拒绝连接或者是查询失败等问题。MyISAM引擎的表每个表需要两个文件描述符,如果是MyISAM的分区表,则每个分区需要两个。可以通过修改open_files_limit系统变量来设置MySQL可用的文件描述符的数量。
table_open_cache表示MySQL打开表的数量,可以在数据库启动时设置好。
MySQL按照以下逻辑来从table cache中淘汰未使用的表:
    • table cache满了,且线程打开一个不再table cache中的表。

    • table cache中表数量达到了table_open_cache的值,且cache中有所有线程都不再使用的表。

    • 执行FLUSH TABLE
      语句,mysqladmin flush-tables
      或者mysqladmin refresh
      命令

当table cache满了时,服务器根据最近最久未使用原则淘汰缓存的表。如果新的表必须要打开,但是table cache已经满了,且没有表能够被释放,则缓存会临时按需扩展,此时,只要有表从使用状态退出到未使用状态就会被淘汰。
通过检查状态变量opened_tables(自从服务启动后MySQL打开的表的数量),可以知道table cache是否合理,如果opened_tables的值很大,且在快速增加(此时并未执行FLUSH TABLE语句),可以考虑在MySQL启动的时候增加table_open_cache的值。
文章转载自写程序的猫,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论