我们有一个在虚拟机上运行的简单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
该表可容纳约800个条目,实际上并不多。但是运行查询
SELECT * FROM addresses
出于测试目的,它似乎永远无法完成。我使用服务器本身上的mysql CLI进行了检查:它输出表的某些行,然后等待很长时间,直到输出下一行。
因此,也许在数据发送阶段存在问题,但我不确定。
该虚拟机具有2GB的RAM,仅使用了320MB。CPU也以1%到2%的极低速度运行。mytop不显示任何其他阻止服务器的查询。IT管理员表示,他们在硬件方面没有做任何更改。
我已经尝试过诸如重新启动数据库服务器,重新启动虚拟机之类的操作。没有任何帮助。
编辑:
EXPLAIN SELECT * FROM addresses
给我这个结果:
+----+-------------+-----------+------+---------------+------+---------+------+------+-------+
| 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)
虚拟盒子,Xen还是其他?主机磁盘如何设置?同一盒中是否还有其他VM运行缓慢?回答这些问题可能会揭示答案
—
Matt
我不是管理程序的所有者,因此我无法真正回答。我已经问过虚拟机管理程序的管理员是否知道最近的任何更改,但他说不。
—
tabb
如果可以,请关闭mysql并运行一些磁盘和内存基准测试。不必太复杂。这样做的目的是隔离是否是mysql的问题,也许是下面答案中指出的索引问题,或者是更广泛的问题。
—
马特
好点,我经历过它可能不是mysql问题。运行
—
tabb
mysql -u username -ppassword mydb -e 'SELECT * FROM addresses
输出缓慢,但是附加`> test.txt`,它运行非常快。现在这可能是一个不同的问题!?我如何对此进行调查?
请与系统管理程序的所有者联系,并要求他们检查日志中是否有任何错误。特别是磁盘错误。告诉他你的症状。立即备份。
—
马特