MySQLスロー書き込み


8

次の表への挿入は、完了するまでに最大70秒かかります。

CREATE TABLE IF NOT EXISTS `productsCategories` (
  `categoriesId` int(11) NOT NULL,
  `productsId` int(11) NOT NULL,
  PRIMARY KEY (`categoriesId`,`productsId`),
  KEY `categoriesId` (`categoriesId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

テーブルには約100,000行あり、ディスク上で7MBを使用しています。

MySQLには、書き込みパフォーマンスを改善できるいくつかの設定がありますか?

私のmy.cnfファイルは次のとおりです:

log-slow-queries="/var/log/mysql/slow-query.log"
long_query_time=1 
log-queries-not-using-indexes

innodb_buffer_pool_size=4G
innodb_log_buffer_size=4M
innodb_flush_log_at_trx_commit=2
innodb_thread_concurrency=8
innodb_flush_method=O_DIRECT

query_cache_size = 6G
key_buffer_size = 284M
query_cache_limit = 1024M
thread_cache_size = 128
table_cache = 12800

sort_buffer_size=2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M

read_buffer_size=128K

open_files_limit               = 1000
table_definition_cache         = 1024
table_open_cache               = 6000

max_heap_table_size=512M
tmp_table_size=4096M

max_connections=1000

thread_concurrency = 24

ハードウェアのセットアップは次のとおりです。

  • デルR710
  • RAID10
  • 48G RAM

このハードウェアを考えると、問題がハードウェアのボトルネックになるとは思わないでしょう。


客観的なデータを提供できますか?ログ、テスト/ベンチマークの方法論と結果、そのようなことですか?
ウォンブル

どのようなログを表示しますか?なぜこんなに時間がかかるのかは、de mtopでしかわかりません。テーブルをmyisamテーブルに変更し、メモリ制限を増やし、スレッドを増やして、テストを行います。
Ronn0

mysqlを改善するための最良の設定は、postgres lolに切り替えることです
アントニーギブス

thread_concurrency = 24は効果がありません...その行をダンプできます
Antony Gibbs

回答:


16

観測#1

最初に目につくのはテーブルの構造です

CREATE TABLE IF NOT EXISTS `productsCategories` (
  `categoriesId` int(11) NOT NULL,
  `productsId` int(11) NOT NULL,
  PRIMARY KEY (`categoriesId`,`productsId`),
  KEY `categoriesId` (`categoriesId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

categoriesIdインデックスとPRIMARY KEYが同じ列で始まることに注意してください。これは冗長なインデックスです。このテーブルはInnoDBであるため、categoriesIdインデックスは別の理由で冗長です。すべてのセカンダリインデックスにはgen_clust_index(別名クラスター化インデックス)へのキーが含まれています。mysqlでgen_clust_index が何に使用されているかを確認してください

categoriesIdインデックスを削除した場合

ALTER TABLE productsCategories DROP INDEX categoriesId;

これにより、追加のセカンダリインデックスとクラスター化インデックスのメンテナンスを行う必要がないため、INSERTが大幅に向上します。

観測#2

一括挿入操作を行う場合は、大きな一括挿入バッファーが必要です。

これに関する私の過去の投稿をご覧ください:

観測#3

ログファイルのサイズが小さすぎます!!! これは、InnoDBバッファープールの25%である必要があります。InnoDBログファイルのサイズを変更する方法に関する私の投稿を参照しください。

観測#4

innodb_thread_concurrencyを設定しないでください!!! Percona Live NYCで直接、その環境をそのままにしておくことを学びました。MySQL 5.5、MySQL 5.1 InnoDBプラグイン、およびPercona Server 5.1以降では、デフォルトで無効になっています。

観測#5

innodb_file_per_tableを使用する必要があります。これが無効になっている場合、ibdata1でのファイルメンテナンスを悪夢にします。これを実装するためにInnoDBをクリーンアップする方法に関する私の投稿を読んでください。

観測#6

MySQL 5.5またはPercona Serverを使用している場合は、特定のオプションを設定して、InnoDBが複数のCPU /マルチコアを使用するようにする必要があります。それらの設定に関する私の投稿をご覧ください。

観測#7

あなたが持っていinnodb_log_buffer_size=4Mます。デフォルトは8Mです。これにより、REDOログへのフラッシュが2倍になります。それもあなたのinnodb_flush_log_at_trx_commit=2設定を打ち消します。32Mに設定してください。また、innodb_log_buffer_sizeのMySQLドキュメントを参照してください。

これらの観察に照らして、次の設定を追加または置き換えてください。

[mysqld]
innodb_thread_concurrency = 0
innodb_read_io_threads = 64
innodb_write_io_threads = 64
innodb_io_capacity = 5000
innodb_file_per_table
innodb_log_file_size=1G
innodb_log_buffer_size=1G
bulk_insert_buffer_size = 256M

わあ、ありがとう!私はすべてのポイントを印刷して作業し、将来他の人々を助けるためにそれを脳に保存しました。どうもありがとう!
Ronn0

2
query_cache_sizeすごいです。挿入するたびに、最大6GBのキャッシュをフラッシュする必要があります。
アーロンブラウン

@AaronBrown同意する。ハイパフォーマンスMySQLの本を読んだところ、InnoDBはクエリキャッシュ内のInnoDBテーブルのトランザクションIDを使用して面倒な処理を行っているため、クエリキャッシュを使用するのが遅くなることは言うまでもありません。実際、MySQL 4.1ではInnoDBのクエリキャッシュが無効になっています。
RolandoMySQLDBA 2012

クエリキャッシュはストレージエンジンから完全に分離されていると思います。基本的に、すべての書き込み操作をシリアル化して、すべてを強制的に実行し、クエリキャッシュをスキャンしてクエリを無効化します。私はそのユースケースを見つけたことがなく、常に問題を引き起こしています。
アーロンブラウン

もう1つ追加する必要があります。query_cache_size= 6G <-これはまったくとんでもないことです。多くの場合、クエリキャッシュは無効にする方が適切であり、32Mまたは64Mより大きくすべきではありません。6Gクエリキャッシュを維持するためのオーバーヘッドは、確かにパフォーマンスを低下させています。
Gavin Towey

0

をチェックする必要innodb_log_file_sizeがあります。デフォルト設定は5Mであり、書き込み集中型のセットアップでは非常に低くなります。100Mに設定することを検討してください。ib_logfile*新しい設定でDBを起動するには、古いファイルを削除する必要があります。DBサーバーの実行中はログファイルを削除しないでください。最初にログファイルを停止する必要があります。おそらく、古いログファイルを削除するだけでなく、最初にバックアップする必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.