【发布时间】: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 列上没有索引,也不会在任何地方触发。
[我尝试过的新事物]
- 创建了一个新表(使用like) 运行 innodb 并插入所有 来自其中一位受影响者的记录 表。 (同样的问题)
- 备份数据库并将其还原到 同一个数据库中的不同数据库 服务器实例。 (同样的问题)
- 将相同的备份恢复到我的 本地机器,我没有 问题。
- 尝试了另一个数据库 在同一个mysql服务器中 有问题的实例 数据库和另一个数据库(一个 Wordpress DB)运行 更新/插入/删除就好了。
- 昨晚重启了mysqld并重启了整个服务器(同样的问题)
- 将 MySQL 更新到 5.0.77 版(同样的问题)
- 从一个受影响的表中删除了所有索引(同样的问题)
有什么想法接下来要看什么或可能是什么问题?似乎是最近才出现的问题,虽然我不能确切地说它是什么时候开始出现的。
【问题讨论】:
-
updated_at 列上是否有索引?
-
这是在什么机器上运行的?在资源有限的机器上(即:没有太多 RAM),MySQL 将无法将主索引保留在内存中,从而强制每次都从磁盘读取它。
-
updated_at 列上没有索引,它位于保证 2 gigs 的 VPS 上。同一 mysql 服务器实例上的另一个数据库 (WordPress) 似乎可以很好地处理更新/插入/删除。
-
什么是数据库/表/列字符集和整理?
update_at是索引的一部分吗?update_at的数据类型?
标签: mysql performance