介绍
在过去的八个月中,我们的团队一直处于侦探任务。当某些代码上线时,一个神秘的图表开始显示使用情况,这是一个过山车的骑行,试图找出根本原因。罪魁祸首? mysql或mariadb DESC
,DESCRIBE
或EXPLAIN
table命令。
Zabbix中为每秒创建的临时表格的图开始波动,而我们原因我们却一无所知。当我们的服务器过载超载时,情况在最近的使用中升级,我们开始注意到我们的流程列表中的许多DESC table
命令。
本文揭示了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
命令的数量就会下降,图形平整。
这是我们采取的步骤的简要概述:
-
分析了缓存行为:我们发现缓存没有保留
DESC
命令结果。 - 实现了适当的缓存:我们修改了代码以正确存储和检索表描述。
- 监视性能:我们密切观察了Zabbix中系统性能和图形。结果是一个明显的改进。
结论
DESC
命令在MySQL/Mariadb中创建临时桌的发现是一个意外的启示,它解决了一个长期存在的谜团。通过了解这种行为并实施适当的缓存,我们能够提高系统的性能。
有时,对复杂问题的解决方案隐藏在最出乎意料的地方。这种经历提醒我们在追求理解和优化系统时毫不犹豫地不遗余力。无论您是经验丰富的数据库管理员还是MySQL/Mariadb的新手,我希望本文能阐明这些数据库系统的鲜为人知的方面,并在旅途中为您提供帮助。