缓慢的MySQL更新/插入/删除

时间:2010-12-01 02:37:02

标签: mysql performance

我似乎在使用MySQL的特定数据库上的所有表上进行缓慢插入,更新和删除。这些表中的数据不是很多(从2k到20k)。少量列(5-10),索引(其中两个),没有重复的索引问题。我正在使用MyISAM运行MySQL 5.0.45。

我运行以下查询,大约需要5-7秒:

UPDATE accounts SET updated_at = '2010-10-09 11:22:53' WHERE id = 8;

选择似乎马上回来了。

解释给我以下内容:

+----+-------------+----------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table    | type  | possible_keys | key     | key_len | ref  | rows | Extra       |
+----+-------------+----------+-------+---------------+---------+---------+------+------+-------------+
|  1 | SIMPLE      | accounts | index | NULL          | PRIMARY | 4       | NULL | 1841 | Using index | 
+----+-------------+----------+-------+---------------+---------+---------+------+------+-------------+

除了看似大量的上下文切换之外,探查器不会显示任何重要数据:

+----------------------+----------+-------------------+---------------------+
| Status               | Duration | Context_voluntary | Context_involuntary |
+----------------------+----------+-------------------+---------------------+
| (initialization)     | 0.000057 |                 0 |                   0 | 
| checking permissions | 0.000008 |                 0 |                   0 | 
| Opening tables       | 0.000013 |                 0 |                   0 | 
| System lock          | 0.000005 |                 0 |                   0 | 
| Table lock           | 0.000005 |                 0 |                   0 | 
| init                 | 0.000061 |                 0 |                   0 | 
| Updating             | 0.000101 |                 0 |                   0 | 
| end                  | 7.957233 |              7951 |                   2 | 
| query end            | 0.000008 |                 0 |                   0 | 
| freeing items        | 0.000011 |                 0 |                   0 | 
| closing tables       | 0.000007 |                 1 |                   0 | 
| logging slow query   | 0.000002 |                 0 |                   0 | 
+----------------------+----------+-------------------+---------------------+

这也可能有所帮助:

+----------------------+----------+-----------------------+---------------+-------------+
| Status               | Duration | Source_function       | Source_file   | Source_line |
+----------------------+----------+-----------------------+---------------+-------------+
| (initialization)     | 0.000057 | check_access          | sql_parse.cc  |        5306 | 
| checking permissions | 0.000008 | open_tables           | sql_base.cc   |        2629 | 
| Opening tables       | 0.000013 | mysql_lock_tables     | lock.cc       |         153 | 
| System lock          | 0.000005 | mysql_lock_tables     | lock.cc       |         162 | 
| Table lock           | 0.000005 | mysql_update          | sql_update.cc |         167 | 
| init                 | 0.000061 | mysql_update          | sql_update.cc |         429 | 
| Updating             | 0.000101 | mysql_update          | sql_update.cc |         560 | 
| end                  | 7.957233 | mysql_execute_command | sql_parse.cc  |        5122 | 
| query end            | 0.000008 | mysql_parse           | sql_parse.cc  |        6116 | 
| freeing items        | 0.000011 | dispatch_command      | sql_parse.cc  |        2146 | 
| closing tables       | 0.000007 | log_slow_statement    | sql_parse.cc  |        2204 | 
| logging slow query   | 0.000002 | dispatch_command      | sql_parse.cc  |        2169 | 
+----------------------+----------+-----------------------+---------------+-------------+

其他信息: 它运行在CentOS-5 VPS上,保证了4演出的内存。在updated_at列上没有索引,也没有在任何地方触发。

[我试过的新事物]

  1. 创建一个新表(使用like) 运行innodb并插入所有 来自其中一个受影响的记录 表。 (同样的问题)
  2. 备份数据库并将其恢复为 不同的数据库在同一个 服务器实例。 (同样的问题)
  3. 将相同的备份恢复到我的 本地机器,我没有 问题。
  4. 尝试了另一个数据库 在同一个mysql服务器中 有问题的实例 数据库和其他数据库(a Wordpress DB)运行 更新/插入/删除就好了。
  5. 昨晚重新启动了mysqld并重新启动了整个服务器(同样的问题)
  6. 将MySQL更新到版本5.0.77(同样的问题)
  7. 从其中一个受影响的表中删除所有索引(同一问题)
  8. 任何想法接下来要看什么或可能是什么问题?似乎更像是一个最近的问题,虽然我不能说它何时开始准确出现。

2 个答案:

答案 0 :(得分:1)

如果您有可变长度的行,则可能需要偶尔运行 OPTIMIZE TABLE

答案 1 :(得分:1)

终于找到了答案。该数据库在某种程度上错过了MYD和MYI文件并仍在运行。考虑到MYD文件保存MyISAM表的数据但是导致缓慢的插入/更新/删除,不确定这是怎么可能的。

我运行了一个ALTER TABLE来将引擎设置为MyISAM(它已经是)并重新创建了这些文件。更新/插入/删除再次快速运行!