web-dev-qa-db-ja.com

16GBのRAMを搭載したクアッドコアマシンでMySQLを最大限に活用する方法は?

科学的データ分析のためにワークステーションでMySQL 5.5サーバーを実行していますが、パフォーマンスを最大限に活用するためにMySQLを構成する方法を考えています。私が通常実行するクエリの種類には10〜20個のテーブルの結合が含まれ、非常に長く実行できます。1〜数分は例外ではありません。同時にデータベースにアクセスするユーザーはごくわずかです(最大5人)。 2.2 GHzデュアルコアと4 GBのRAM)を搭載したLenovo Thinkpad T61から、サーバーをコンポーネントを手動で選択した次の新品のマシンに移動しました。

  • Intel i7 3770、4x 3.4 GHz(4x3.7 GHzで稼働)
  • Z77チップセット
  • 16 GBのDDR3 1600 RAM
  • Windows 7 Prof 64ビット
  • WindowsおよびMySQLサーバーは、Intel 520シリーズSSDドライブで実行されます。

最初のテスト(両方のマシンで同じクエリを実行)は、新しいテストの速度の決定的な改善を示しましたが、クエリにはまだ多くの時間がかかり、さらに向上することを期待していました。問題のクエリはかなりよく最適化されています。つまり、すべてのテーブルには適切なキーがあり、「拡張説明」の時点でも使用されています。

さて、現在のMySQLの設定に戻ります。最初に、ずっと前にMyISAMからInnodbに移行したことを述べておきます。

My.iniの微調整の一部(つまり、デフォルト設定からの逸脱):

# Maximum size for internal (in-memory) temporary tables. If a table
# grows larger than this value, it is automatically converted to disk
# based table This limitation is for a single table. There can be many
# of them.
#tmp_table_size=35M
tmp_table_size=4000M
max_heap_table_size=4000M

# InnoDB, unlike MyISAM, uses a buffer pool to cache both indexes and
# row data. The bigger you set this the less disk I/O is needed to
# access data in tables. On a dedicated database server you may set this
# parameter up to 80% of the machine physical memory size. Do not set it
# too large, though, because competition of the physical memory may
# cause paging in the operating system.  Note that on 32bit systems you
# might be limited to 2-3.5G of user level memory per process, so do not
# set it too high.
#innodb_buffer_pool_size=96M
innodb_buffer_pool_size=800M

general-log
expire_logs_days = 60
general_log_file = "F:/my_query_mysql.log"
log-output = TABLE
optimizer_search_depth = 0 #meant to cure the "statistics state" bug in some queries

誰かが上記の数値の変更を提案するのか、私が知らない設定をさらに提案するのか知りたいのですが。

役立つコメントをいただければ幸いです。

スティーブ

編集:私は10〜20のテーブルにわたる結合を含む2つのクエリがあり、それらを私のLenovoノートブックと新しいPCで実行しました。クエリ#1は、新しいマシンでは3分36秒でしたが、ラップトップでは9分11秒でした。クエリ#2は、ワークステーションで22.5秒、ラップトップで48.5秒かかりました。そのため、実行速度は約2-2.5倍向上しました。ワークステーションでは、RAM)の50%も使用されていません。4つのコア全体の平均CPU負荷(Windowsタスクマネージャーによる報告)は、約13%にすぎませんでした。 -Coreベーシス(Core Tempによって報告)は、1つのコアでは約25-40%でしたが、他のコアでは<= 10%でした。これは、MySQLが単一のクエリで複数のコアを使用しないことを示しています。

10
Steve06

MySQL 5.5を実行しているため、複数のコアにアクセスするようにInnoDBを構成することを検討してください。

使用すべき設定は次のとおりです

innodb_thread_concurrency InnoDBが開いたままにできる並行スレッドの数の上限を設定します。これに設定する最適なラウンド数は、(2 X CPU数)+ディスク数です。 [〜#〜] update [〜#〜]:Percona NYC Conferenceから直接学んだように、警告するにはこれを0に設定する必要がありますInnoDBストレージエンジンを使用して、実行している環境に最適なスレッド数を見つけます。

innodb_concurrency_tickets は、問題のない並行処理チェックをバイパスできるスレッドの数を設定します。この制限に達すると、スレッドの同時実行チェックが再び標準になります。

innodb_commit_concurrency は、コミットできる同時トランザクションの数を設定します。デフォルトは0なので、これを設定しないと、任意の数のトランザクションを同時にコミットできます。

innodb_thread_sleep_delay は、InnoDBキューに再び入る前にInnoDBスレッドが休止できるミリ秒数を設定します。デフォルトは10000(10秒)です。

innodb_read_io_threads および innodb_write_io_threads (両方ともMySQL 5.1.38以降)は、指定した数のスレッドを読み取りと書き込みに割り当てます。デフォルトは4で、最大は64です。

innodb_replication_delay innodb_thread_concurrencyに達した場合、スレーブにスレッド遅延を課します。

MySQL 5.5とInnoDBの複数のコアをアクティブ化することに関する私の過去の投稿は次のとおりです

5
RolandoMySQLDBA

Percona-主要なMySQLコンサルタントが MySQL設定ウィザード を提供しています。 my.cnf/my.iniシステム構成によって異なります。

また、Perconaの人々は " High Performance MySQL "という本をリリースしました。第3版は最近リリースされ、チューニングを非常に詳しく説明しています。

2
Mahesh Patil

メモリ使用量: http://mysql.rjweb.org/doc.php/memory を参照してください(ほとんどの調整パラメータでは問題になるほどの違いはありません)。

max_heap_table_size = 4000Mは危険です。 4人のユーザーが必要とする場合、RAMとスワッピングが不足しています。スワッピングは、実質的に何よりもパフォーマンスに大きな影響を与えます。

数秒以上かかるクエリ:改善のために調査する必要があります。 SHOW CREATE TABLEを提供してください。 SHOW TABLE STATUS; EXPLAIN SELECT

1
Rick James

Otgerオプションも検討できます。 FreeBSDのPostgreSQLなど。ただし、WindowsからLinuxに切り替えると、パフォーマンスが向上します。

0
ilhan