科学的データ分析のためにワークステーションで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 Tempによって報告)は、1つのコアでは約25〜40%でしたが、他のコアでは<= 10%でした。これは、MySQLが単一のクエリで複数のコアを使用しないことを示しています。 。