2010-12-01 114 views
2

我似乎有緩慢插入,更新和刪除操作上與MySQL特定數據庫中的所有表。這些表格中沒有很多數據(從2k到20k)。少數列(5-10),索引(其中兩個),並且沒有重複的索引問題。我使用MyISAM運行MySQL 5.0.45。慢的MySQL更新/插入/刪除

我運行下面的查詢,大約需要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 | 
+----------------------+----------+-----------------------+---------------+-------------+ 

附加信息: 它的運行o n一個CentOS-5 VPS,有4個ram保證。 updated_at列上沒有索引,不會觸發任何地方。

[我嘗試新的東西]

  1. 創建一個新表(使用等) 運行InnoDB和從受影響 的一個表中插入的所有 記錄。 (同樣的問題)
  2. 備份的數據庫和相同的 服務器實例中它還原到 不同的數據庫。 (同樣的問題)
  3. 恢復是相同的備份到我的 本地機器上,我並沒有 問題。
  4. 試過有問題 數據庫和其他數據庫( WordPress的DB)跑 更新/插入同一個MySQL服務器 實例中的另一個數據庫 /刪除就好了。
  5. 的restarted mysqld並重新啓動整個服務器昨晚(同樣的問題)
  6. 更新MySQL來5.0.77版本(同樣的問題)
  7. 刪除所有索引從受影響的表之一(同樣的問題)

任何想法來看待未來或可能是什麼問題呢?似乎更多是一個近期的問題,儘管我不能說它何時開始出現。

+0

在updated_at列上有索引嗎? – 2010-12-01 03:59:49

+0

這是在什麼樣的機器上運行?在資源有限的機器上(即:RAM不多),MySQL將無法將主索引保留在內存中,迫使它每次都從磁盤讀取數據。 – 2010-12-01 05:21:34

回答

1

終於找到了答案。該數據庫在某種程度上遺漏了MYD和MYI文件並仍在運行。考慮到MYD文件保存了MyISAM表的數據,但是這導致緩慢的插入/更新/刪除,不知道這是可能的。

我運行了一個ALTER TABLE以將引擎設置爲MyISAM(它已經是),並且它重新創建了這些文件。更新/插入/刪除再次快速運行!

1

如果您有可變長度的行,您可能需要偶爾運行OPTIMIZE TABLE