揭示了这个谜:“ desc”命令如何在mysql/mariadb中创建临时桌子
#mysql #mariadb #debug #troubleshooting

介绍

在过去的八个月中,我们的团队一直处于侦探任务。当某些代码上线时,一个神秘的图表开始显示使用情况,这是一个过山车的骑行,试图找出根本原因。罪魁祸首? mysql或mariadb DESCDESCRIBEEXPLAIN table命令。

Zabbix中为每秒创建的临时表格的图开始波动,而我们原因我们却一无所知。当我们的服务器过载超载时,情况在最近的使用中升级,我们开始注意到我们的流程列表中的许多DESC table命令。

Image description

本文揭示了DESC命令的行为及其与临时表创建的链接,这一发现阐明了我们的理解并允许我们解决问题。

什么是DESC命令?

MySQL或MariadB中的DESC命令用于描述表的结构。它提供了有关表的列,类型和其他属性的信息。这是一个简单的例子:

DESC employees;

这将显示employees表的结构,包括列名称,数据类型等。

+------------+--------------+------+-----+---------+-------+
| Field      | Type         | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| id         | int          | NO   | PRI | NULL    |       |
| first_name | varchar(50)  | YES  |     | NULL    |       |
| last_name  | varchar(50)  | YES  |     | NULL    |       |
| salary     | decimal      | YES  |     | NULL    |       |
| hire_date  | date         | YES  |     | NULL    |       |
+------------+--------------+------+-----+---------+-------+

意外行为:临时表创建

引起我们注意的是,在运行DESC命令时出现“创建临时表”的描述。这令人困惑,导致我们进一步研究。

为什么会创建临时表?

临时表通常用于存储复杂查询的中间结果。但是,我们没想到它们会链接到DESC命令。挖掘MySQL/Mariadb文档和源代码后,我们意识到DESC命令确实创建了一个临时表来存储并显示查询表的结构。

对性能的影响

经常创建临时表正在对我们的系统造成巨大损失。服务器已超载,网站的性能恶化。

我们的代码使用DESC命令来填充数据库映射器,并且似乎缓存工作不正常。这导致了过多数量的DESC命令,导致了意外的临时表。

我们如何解决问题

我们的解决方案涉及纠正缓存机制。一旦缓存正常运行,DESC命令的数量就会下降,图形平整。

这是我们采取的步骤的简要概述:

  1. 分析了缓存行为:我们发现缓存没有保留DESC命令结果。
  2. 实现了适当的缓存:我们修改了代码以正确存储和检索表描述。
  3. 监视性能:我们密切观察了Zabbix中系统性能和图形。结果是一个明显的改进。

Image description

结论

DESC命令在MySQL/Mariadb中创建临时桌的发现是一个意外的启示,它解决了一个长期存在的谜团。通过了解这种行为并实施适当的缓存,我们能够提高系统的性能。

有时,对复杂问题的解决方案隐藏在最出乎意料的地方。这种经历提醒我们在追求理解和优化系统时毫不犹豫地不遗余力。无论您是经验丰富的数据库管理员还是MySQL/Mariadb的新手,我希望本文能阐明这些数据库系统的鲜为人知的方面,并在旅途中为您提供帮助。