質問

最近、テーブルの1つをInnoDBに切り替えましたが、今では非常に遅い更新実行時間が発生しています。 0.010-0.030秒かかるアップデートには、70秒以上かかることがあります。一部のクエリは、デフォルトの50秒の制限内でロックを取得できないため削除されます(この制限を上げることができると気づきます)。

問題のテーブルには、1つのインデックスのみがあります。これは、Mediumint値である主キー自体です。テーブルには約100万列があります。このコンテキストのすべての更新には、単一の行が含まれます。通常、その行から4〜5列がすべてのクエリで影響を受けます。

現在のmy.cnfは以下に貼り付けられています。 InnoDBの更新パフォーマンスが悪い可能性があるものはありますか?

[mysqld]
set-variable=local-infile=0

datadir=/db/mysql/data
socket=/var/lib/mysql/mysql.sock
#log = /var/log/mysqld.log
log-error = /var/log/mysqld.error.log
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1


skip-locking
key_buffer = 1G
query_cache_size = 256M
thread_cache_size = 128
table_cache = 2048
max_connections = 400
query_cache_limit = 1024M
log_slow_queries = /var/log/mysql-slow.log
long_query_time = 1
skip-bdb
skip-locking
skip-name-resolve

innodb_buffer_pool_size=1G
innodb_additional_mem_pool_size=20M
innodb_flush_log_at_trx_commit=2
#innodb_log_file_size=250M
innodb_log_buffer_size=8M
innodb_lock_wait_timeout=50


[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

アップデート:
innodb_log_file_size:5242880
have_innodb:はい
「ここで」句は常に1つの列のみを探します。これが主キーです。

更新 - 2012年7月26日:
データベースをMySQL 5.5にアップグレードしました。これで、INNODBの更新は非常に高速で、特定のケースでは0.010秒未満です。そして、分散はかなり低いです。これからの私の見解は、InnodbをMySQL 5.0に本当に注意して使用する必要があります。

役に立ちましたか?

解決

視点#1

InnoDBでのみプライマリキーで更新すると、クラスター化されたインデックス(別名 gen_clust_index)ロックできます。

私はかつて3つの投稿に答えました 一人の個人 この教科では

これらを注意深く読んでください。これらの質問のポスターは、Seeing InnoDBクラスターインデックスロック動作に基づいて、彼自身の回避策を見つけました。悲しいことに、彼は回避策が何であるかを投稿しませんでした。

さらに、クエリがゆっくりと実行されているのを確認したら、mysqlにログインして実行します SHOW ENGINE INNODB STATUS\G クラスター化されたインデックスでロックを探し始めます。

視点#2

あなたがコメントしたのを見ます innodb_log_file_size. 。デフォルトである5MBでそれを持っています。以来 innodb_buffer_pool_size 1gに設定されている場合、Innodb_log_file_sizeは256mである必要があります。 innodb_log_file_sizeを256mに設定するには、ここをクリックしてください.

視点#3

私はあなたが使用していないと思います innodb_file_per_table. 。 100列の1つのテーブル用に特別にテーブルの更新を行うために使用することをお勧めします。 innodb_file_per_tableを使用するためにinnodbインフラストラクチャをクリーンアップする方法を確認するには、ここをクリックしてください.

他のヒント

  1. 主キー値の値を更新していますか?

  2. 他のテーブルに対する列の外部キーはありますか? InnoDBは、カスケードを介して同じトランザクションで外部キーを更新するためです。

  3. innodb_buffer_pool_sizeを1GB以上に増やして、テーブル全体がメモリに収まるようにできますか?

  4. Schmeaには他にいくつのテーブルがありますか - アップデートを実行するためにテーブルスペースのサイズを変更する問題がある可能性があるため

  5. 各テーブルにテーブルスペースファイルが作成されているinnodb_file_per_tableを使用してみてください。このパラメーターを変更したら、サーバーを再起動する必要があります。次に、データベースを新たに作成して、有効になります。

ライセンス: CC-BY-SA帰属
所属していません dba.stackexchange
scroll top