2010-12-01 19 views
2

MySQLを使用している特定のデータベースのすべてのテーブルで、挿入、更新、削除が遅いようです。これらのテーブルのデータは大量ではありません(2kから20kまで)。少数の列(5〜10)、索引(2つ)、重複索引の問題なし。私は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ギガのラムが保証されています。 updated_at列にインデックスがなく、どこでもトリガされません。

(のように使用して)新しいテーブルを作成し、[私が試した新しい物事]

  1. はInnoDBテーブルを実行し、影響を受けた テーブルのいずれかからすべての レコードを挿入します。 (同じ問題)
  2. データベースをバックアップし、同じ サーバーインスタンス内の異なるデータベース に復元しました。 (同じ問題)
  3. 同じバックアップを私の ローカルマシンに復元しましたが、私には の問題がありませんでした。
  4. 問題データベースと他のデータベース( ワードプレスDB)を有し、同一のMySQLサーバ インスタンス内の別のデータベース を試みたが 更新/挿入を実行/うまく削除します。
  5. 再起動のmysqldとバージョン5.0.77(同じ問題)
  6. にMySQLを更新しました昨夜(同じ問題)
  7. サーバ全体を再起動するには、影響を受ける表の1から
を(同じ問題を)すべてのインデックスを削除しました

次に見たいものや何が問題なのでしょうか?私はそれが正確に表示され始めたときに私は言うことはできませんが、最近の問題の詳細になるようです。

+0

updated_at列にインデックスがありますか? –

+0

これはどのマシンで実行されていますか?リソースが限られているマシン(つまり、あまりRAMはない)では、MySQLはメインインデックスをメモリに保持して毎回ディスクから強制的に読み込むことができません。 –

+0

updated_at列にインデックスがありません。また、2ギガが保証されているVPSにあります。同じmysqlサーバインスタンス上の別のデータベース(WordPress)は、更新/挿入/削除をうまく処理しているようです。 – Ruben

答えて

1

最後に答えが見つかりました。そのデータベースは何とかMYDとMYIファイルが失われていて、まだ実行中です。 MYISファイルがMyISAMテーブルのデータを保持しているが、挿入/更新/削除が遅いということを考えればどうなるかわかりません。

私はエンジンをMyISAMに設定するためにALTER TABLEを実行しました(既にあったものです)、それらのファイルを再作成しました。更新/挿入/削除がすぐに実行されます!

1

可変長の行がある場合は、OPTIMIZE TABLEを実行する必要があります。

+0

テーブルをロックします。アクティビティはdbで低く、この問題を示すほとんどのアクション(2kレコード)を取得するテーブルがあるので、OPTIMIZE TABLEを実行しました。立ち入り禁止。同じ問題。 – Ruben

+0

マシンバイタルはありますか?負荷平均? vmstat info?ローラム?ディスクioの多く?同じmysqlサーバ上の他のデータベースがたくさんありますか? mysqlを再起動してみますか?問題は本当に奇妙です=( – superfro

+0

)MySQLを早く再起動しようとしましたが、すべての重要な統計情報は綺麗に見える、眠っている、ローカルマシンのデータベースに最新のバックアップが復元されています。現時点では、すべてがうまくいくと考えると意味がありません。ローカルでは、コンテキスト切り替えとの違いがあります.1対7951がContext_voluntaryにリストされています。 – Ruben

関連する問題