专栏首页SEian.G学习记录MySQL是如何打开和关闭表?

MySQL是如何打开和关闭表?

当我们在执行mysqladmin status 命令或连接通过mysql客户端连接到实例后,执行\s的时候,应该看到类似以下的内容:

Uptime: 62239177  Threads: 132  Questions: 2739091116  Slow queries: 19983986  Opens: 2732  Flush tables: 1  Open tables: 2048  Queries per second avg: 44.009

今天我们就重点来看一下,Open tables和 Flush tables,看下MySQL是如何打开和关闭表的;

MySQL是多线程的,因此可能有许多客户端同时为给定表发出查询。为了最大程度地减少同一张表上具有不同状态的多个客户端会话的问题,每个并发会话会独立打开该表。这会使用额外的内存,但通常会提高性能。对于MyISAM表,每个打开表的客户端的数据文件都需要一个额外的文件描述符。(相比之下,索引文件描述符在所有会话之间共享。)

该table_open_cache和 max_connections系统变量影响服务器保持打开的文件的最大数量。如果增加这两个值中的一个或两个,则可能会遇到操作系统对打开文件描述符的每个进程数的限制。

table_open_cache与相关max_connections。例如,对于200个并发运行的连接,指定的表缓存大小至少为 200 *N,其中 N是您执行的任何查询中每个联接的最大表数。还必须为临时表和文件保留一些额外的文件描述符。

确保操作系统可以处理该table_open_cache设置所隐含的打开文件描述符的数量 。如果 table_open_cache设置得太高,MySQL可能会用完文件描述符,并表现出诸如拒绝连接或无法执行查询之类的症状。

还应考虑到MyISAM 存储引擎对于每个唯一的打开表都需要两个文件描述符。要增加可用于MySQL的文件描述符的数量,请设置 open_files_limit系统变量。

打开表的缓存保持在table_open_cache条目级别 。服务器在启动时自动调整缓存大小。要显式设置大小,请在启动时设置table_open_cache 系统变量。MySQL可能会临时打开更多表来执行查询

在以下情况下,MySQL关闭未使用的表并将其从表缓存中删除

当缓存已满并且线程尝试打开不在缓存中的表时。 当高速缓存包含多个table_open_cache条目并且高速缓存中 的表不再被任何线程使用时。 当进行表刷新操作时。当有人发出一条FLUSH TABLES语句或执行 mysqladmin flush-tables或 mysqladmin refresh命令时,会发生这种情况。

表高速缓存填满后,服务器将使用以下过程找到要使用的高速缓存条目

从最近最少使用的表开始,释放当前未使用的表。 如果必须打开一个新表,但是缓存已满,并且无法释放任何表,则可以根据需要临时扩展缓存。当缓存处于临时扩展状态并且表从已使用状态变为未使用状态时,该表将关闭并从缓存中释放。

MyISAM将为每个并发访问打开 一个表。这意味着,如果两个线程访问同一个表,或者如果一个线程在同一查询中两次访问该表(例如,通过将表连接到自身),则该表需要打开两次。每个并发打开都需要在表缓存中有一个条目。任何MyISAM表的第一次打开都 需要两个文件描述符:一个用于数据文件,一个用于索引文件。该表的每次其他使用都只为数据文件使用一个文件描述符。索引文件描述符在所有线程之间共享。

如果要使用 HANDLER tbl_name 该语句打开表,则会为该线程分配专用的表对象。该表对象不与其他线程共享,并且在线程调用或线程终止之前不会关闭。发生这种情况时,会将表放回表高速缓存中(如果高速缓存未满)。

要确定表缓存是否太小,请检查 Opened_tables状态变量,该变量指示自服务器启动以来表打开操作的数量:

mysql> SHOW GLOBAL STATUS LIKE 'Opened_tables';+---------------+-------+|Variable_name|Value|+---------------+-------+|Opened_tables|2741|+---------------+-------+

如果该值很大或迅速增加,即使没有发出很多FLUSH TABLES语句,也请在服务器启动时增加table_open_cache该值。

本文分享自微信公众号 - DBA的辛酸事儿(dbabitter),作者:SEian.G

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-07-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何在 Linux 终端中打开和关闭目录

    要在具有图形界面的计算机上打开目录,请双击文件夹。它打开,您现在“在”该文件夹中。

    施主-借个火
  • 技术分享 | MySQL SHELL 是如何操作关系表的?

    资深数据库专家,专研 MySQL 十余年。擅长 MySQL、PostgreSQL、MongoDB 等开源数据库相关的备份恢复、SQL 调优、监控运维、高可用架构...

    爱可生开源社区
  • C# WPF如何关闭通过父窗口打开的所有子窗口

    总结, 注意WPF中调试要排除无标题窗口,否则会导致程序被关闭。 这里的无标题窗口是WPF的界面调试器,如果它被关闭会导致被调试的程序也被关闭,Release程...

    zls365
  • MySQL数据库面试题和答案(一)

    程序你好
  • Mysql常见问题解决

    用户1733354
  • 用于查看配置的存储过程 | 全方位认识 sys 系统库

    在上一篇《用于修改配置的存储过程 | 全方位认识 sys 系统库》中,我们介绍了sys 系统库中用于修改配置的存储过程,利用这些存储过程可以代替修改perfor...

    老叶茶馆
  • Python操作mysql数据库知识大全

    Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口。

    Python知识大全
  • 给linux用户的11个高级MySQL数据库面试问题和答案

    1. 如何使用SELECT语句找到你正在运行的服务器的版本并打印出当前数据库的名称? 答:下面的语句的结果会显示服务器的版本和当前的数据库名称 mysql>...

    小小科
  • MySQL数据库常见面试题,不得不看!!!

    在Database一列中显示NULL是因为我们当前没有选择任何数据库。因此,使用下面的语句先选择一个数据库,就能看到相应的结果。

    用户5224393
  • centos6.5下安装zabbix2.4的教程图解

    centos-DVD1版本系统固定IP地址是192.168.159.128 ,centos-mininal 版本系统 地址是192.168.1.* 或者192....

    砸漏
  • centos6.5下安装zabbix2.4的教程图解

    centos-DVD1版本系统固定IP地址是192.168.159.128 ,centos-mininal 版本系统 地址是192.168.1.* 或者192....

    砸漏
  • mysql乱码设置

    MySQL默认字符编码的设置 MySQL的默认编码是Latin1,不支持中文,那么如何修改MySQL的默认编码呢,下面以UTF-8为例来说明  需...

    闵开慧
  • MySQL FAQ 系列 : 如何安全地关闭 MySQL 实例

    本文分析了 mysqld 进程关闭的过程,以及如何安全、缓和地关闭 MySQL 实例,对这个过程不甚清楚的同学可以参考下。

    叶金荣
  • python操作mysql数据库

    Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口。

    想偷懒的程序员
  • python访问数据库

      python就内置了SQLite,所以python使用SQLite不需要安装任何东西,直接进行使用。

    yaohong
  • 运维学python之爬虫中级篇(九)Py

    最近因为年底,连续两个项目要投产上线,又赶上公司年会,忙的要死,更新有些慢,见谅。今天要说一说python如何对mysql进行操作。在 Python3.x 版本...

    py3study
  • Python快速学习第九天--安装并操作Mysql数据库

    python操作mysql数据库 Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口。...

    汤高
  • Python 操作 MySQL 数据库

    MySQLdb 是用于Python链接Mysql数据库的接口,它实现了 Python 数据库 API 规范 V2.0,基于 MySQL C API 上建立的。

    用户5005176
  • python接口自动化(三十八)-python操作mysql数据库(详解)

      现在的招聘要求对QA人员的要求越来越高,测试的一些基础知识就不必说了,来说测试知识以外的,会不会一门或者多门开发与语言,能不能读懂代码,会不会Linux,会...

    北京-宏哥

扫码关注云+社区

领取腾讯云代金券