mysql table_open_*(打开表) 和 open_files_*(文件句柄数) 相关的几个参数

mysql 执行sql语句涉及到表时需要打开这张表然后进行操作,mysql中有一些跟打开表相关的参数,这里记录一下:

点击查看代码
open_files_limit
innodb_open_files
table_definition_cache 
table_open_cache
table_open_cache_instances 

1、open_files_limit
它定义了MySQL服务进程(mysqld)能够同时打开的最大文件描述符数量。在MySQL运行过程中,打开的文件可以包括数据表、日志文件、临时文件以及其他与数据库操作相关的文件。
该值的计算公式:

  • 10 + max_connections + (table_open_cache * 2)
  • max_connections * 5
  • 如果操作系统设置了hard nofile ,则使用操作系统的值即可
  • 默认值5000
  • 需要重启mysql 生效

由于文件描述符资源是操作系统级别的限制,因此,在设置open_files_limit时需要确保其值小于或等于操作系统的最大允许打开文件数限制。如果MySQL需要的文件描述符数超过了系统允许的最大值,可能会导致“Too many open files”错误,影响数据库的正常运行和服务质量。

# 设置操作系统文件描述符的限制

点击查看代码
vim /etc/security/limits.conf
* hard nproc  2048          # 用户创建进程数的限制
* soft nproc  2048
* hard nofile 65535          # 用户打开文件句柄数的限制
* soft nofile 65535


# 软限制和硬限制的区别:
软限制(Soft Limit):可以使用的资源的最大值。
当一个进程试图超过其软限制时,系统会允许它暂时突破这个限制,但最终进程必须将资源使用量降低到软限制以下

硬限制(Hard Limit):这是当前用户或者系统能够设定的某个资源的绝对最大值。任何单个进程都不能设置超过硬限制的软限制。

hard nproc 用于设定一个用户可以创建的最大进程数。这里的 nproc 指的是“number of processes”。

2、innodb_open_files

它用于设置InnoDB能够同时保持打开的表文件数量。当innodb引擎打开的表文件超过innodb_open_files设定的值,超出部分的表文件将无法被立即打开,而需要等待已打开的表文件关闭后才能重新分配资源来打开新的表文件。

3、table_open_cache
它定义了MySQL能够同时在内存中缓存的已打开表的数量。当客户端执行SQL查询时,MySQL需要访问数据表,如果该表已经在table_open_cache中被打开,则可以直接从缓存中读取,避免了重新打开表文件带来的磁盘I/O操作和表结构解析的开销。

默认值为2000,取值公式为
MAX(
(open_files_limit - 10 - max_connections) / 2,
400
)

4、table_open_cache_instances
table_open_cache 参数定义了MySQL能够同时在内存中缓存的已打开表的数量。随着并发查询和事务操作的增多,单个表打开缓存可能会成为性能瓶颈,因为所有线程都共享这一个缓存,竞争激烈时会导致效率下降。

为了解决这个问题,MySQL引入了 table_open_cache_instances 参数。当设置此参数大于1时,MySQL会将整个table_open_cache 分割成多个独立的子缓存(称为实例),每个实例都有自己独立的打开表空间。这样可以减少不同线程间对同一缓存的竞争,提高并发环境下打开和关闭表的效率。

例如,如果你将 table_open_cache 设置为 1000,并且将 table_open_cache_instances 设置为 4,则MySQL将会创建4个独立的打开表缓存,每个缓存可容纳250个打开的表

5、table_definition_cache
它决定了MySQL能够同时缓存的表定义(即.frm文件)的数量。
与普通表缓存不同,表定义缓存占用的空间较小,并且不使用文件描述符。最小值为400,上限为2000,默认值基于以下公式,:
400 + (table_open_cache / 2)

6、max_connections
这个参数决定了数据库允许的最大连接数,如果连接数超过了该值,则会报Too many connections的错误。参数默认值是151
注意:max_connections最大有效值是open_files_limit-810和max_connections设置的值中的较小值。

posted @   有形无形  阅读(35)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示