【问题标题】:Slow MySQL Updates/Inserts/Deletes缓慢的 MySQL 更新/插入/删除
【发布时间】:2010-12-01 02:37:02
【问题描述】:

我似乎在使用 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 gigs 内存。 updated_at 列上没有索引,也不会在任何地方触发。

[我尝试过的新事物]

  1. 创建了一个新表(使用like) 运行 innodb 并插入所有 来自其中一位受影响者的记录 表。 (同样的问题)
  2. 备份数据库并将其还原到 同一个数据库中的不同数据库 服务器实例。 (同样的问题)
  3. 将相同的备份恢复到我的 本地机器,我没有 问题。
  4. 尝试了另一个数据库 在同一个mysql服务器中 有问题的实例 数据库和另一个数据库(一个 Wordpress DB)运行 更新/插入/删除就好了。
  5. 昨晚重启了mysqld并重启了整个服务器(同样的问题)
  6. 将 MySQL 更新到 5.0.77 版(同样的问题)
  7. 从一个受影响的表中删除了所有索引(同样的问题)

有什么想法接下来要看什么或可能是什么问题?似乎是最近才出现的问题,虽然我不能确切地说它是什么时候开始出现的。

【问题讨论】:

  • updated_at 列上是否有索引?
  • 这是在什么机器上运行的?在资源有限的机器上(即:没有太多 RAM),MySQL 将无法将主索引保留在内存中,从而强制每次都从磁盘读取它。
  • updated_at 列上没有索引,它位于保证 2 gigs 的 VPS 上。同一 mysql 服务器实例上的另一个数据库 (WordPress) 似乎可以很好地处理更新/插入/删除。
  • 什么是数据库/表/列字符集和整理? update_at 是索引的一部分吗? update_at 的数据类型?

标签: mysql performance


【解决方案1】:

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

【讨论】:

  • 锁定表。数据库中的活动很低,我有一个表几乎没有动作(2k 记录)显示这个问题,所以我在它上面运行了 OPTIMIZE TABLE。不去。同样的问题。
  • 机器生命体征如何?平均负载? vmstat 信息?低内存?很多磁盘 io 吗?同一个mysql服务器上有很多其他数据库?尝试重启mysql?问题听起来很奇怪 =(
  • 尝试过早点重启 MySQL。所有重要数据看起来都很棒;它在睡觉。我还将最新的备份还原到本地计算机上的数据库中。所有更新/插入/删除都很快。此时发生的活动很少,考虑到一切看起来都很好,这没有任何意义。在本地,上下文切换存在差异:1 vs. 7951 列在 Context_volunte 中。
【解决方案2】:

终于找到答案了。该数据库不知何故丢失了 MYD 和 MYI 文件,但仍在运行。考虑到 MYD 文件包含 MyISAM 表的数据,但不知道这怎么可能,但这会导致插入/更新/删除速度缓慢。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-27
    • 2018-06-12
    • 2012-03-12
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多