MySQL 在非常简单的 SELECT 查询上非常慢

tab*_*abb 10 mysql linux performance io

我们有一个在虚拟机上运行的简单 Web 应用程序,该应用程序使用 InnoDB 引擎将其数据保存在 MySQL 5.5 数据库中。一切正常运行了大约三年,但突然变得非常缓慢。

例如,我有一个非常简单的表保存地址:

CREATE TABLE `addresses` (
  `address_id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(64) CHARACTER SET latin1 NOT NULL,
  `firstname` varchar(64) CHARACTER SET latin1 NOT NULL,
  `street` varchar(64) CHARACTER SET latin1 NOT NULL,
  `housenumber` varchar(16) CHARACTER SET latin1 NOT NULL,
  `zip` varchar(5) CHARACTER SET latin1 NOT NULL,
  `city` varchar(64) CHARACTER SET latin1 NOT NULL,
  `email` varchar(64) CHARACTER SET latin1 NOT NULL,
  `phone` varchar(16) CHARACTER SET latin1 NOT NULL,
  `birthdate` date NOT NULL,
  PRIMARY KEY (`address_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
Run Code Online (Sandbox Code Playgroud)

这张表包含大约 800 个条目,这真的不多。但是运行查询

SELECT * FROM addresses
Run Code Online (Sandbox Code Playgroud)

出于测试目的,它似乎永远不会完成。我使用服务器本身的 mysql CLI 进行了检查:它输出表的一些行,然后等待很长时间,直到输出下一行。

所以也许这是数据发送阶段的问题,但我不确定。

VM 有 2GB 的 RAM,仅使用了 320MB。CPU 也以非常低的 1% 到 2% 运行。mytop 不会显示任何其他阻塞服务器的查询。IT 管理员表示,他们没有在硬件方面进行任何更改。

我已经尝试过一些事情,比如重新启动数据库服务器,重新启动虚拟机。没有任何帮助。

编辑:

EXPLAIN SELECT * FROM addresses
Run Code Online (Sandbox Code Playgroud)

给我这个结果:

+----+-------------+-----------+------+---------------+------+---------+------+------+-------+
| id | select_type | table     | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-----------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | addresses | ALL  | NULL          | NULL | NULL    | NULL |  793 |       |
+----+-------------+-----------+------+---------------+------+---------+------+------+-------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

小智 13

如果 cpu 负载较低,则表明没有缺少索引的问题,如果是这种情况,查询将只需要更多的 cpu 和磁盘访问。你还说它工作正常3年。

您是否检查了一般磁盘访问速度(特别是在数据库所在的分区上)?例如使用dd like here。您所描述的听起来像是死磁盘或半死不活的突袭。我希望有备份吗?


Ant*_*ito 9

你可以尝试几件事,

  1. 你有索引设置吗?

索引使得无需先进行全表扫描即可快速查找记录成为可能,从而大大缩短了执行时间。

CREATE INDEX idx_name ON addresses(name);
Run Code Online (Sandbox Code Playgroud)
  1. 在运行查询之前首先使用 EXPLAIN 关键字,

当在 SELECT 查询之前使用时,它将描述 MySQL 打算如何执行查询以及它在完成之前需要处理的行数。

  1. 对您的 mysql.ini 进行一些更改,如果它是虚拟机,则增加 RAM 并配置您的 mysql.ini 以查看性能是否提高。

有许多 MySQL 优化器可以为您提供指导。

帮助这有帮助