Mysqlサーバーのパフォーマンスを調整する必要があり、助けが必要です。
MySQL専用の16Gサーバーに1つのMyISAMテーブルがあり、かなりの量のトラフィックを取得する約200万行が含まれています。同じデータベースには、他に約100のinnodbテーブルがあります。 MyISAMテーブルはほとんど読み取り専用で、ユーザーが検索に使用します。
サーバーのmax_connection値は800です。約300の同時ユーザーの負荷テストでは、クエリ時間が大幅に増加し始めます。負荷がない場合、クエリの実行には約500ミリ秒かかります。
MyISAMテーブルでの検索のパフォーマンスを大幅に向上させることが目標です。
テーブルのサイズ(MB):
data_size index_size total engine
8991 6920 15911 InnoDB
1110 718 1829 MyISAM
以下は私の設定です:
connect_timeout 10
innodb_additional_mem_pool_size 24117248
innodb_buffer_pool_size 12G
innodb_commit_concurrency 0
innodb_flush_log_at_trx_commit 1
innodb_log_buffer_size 11534336
innodb_log_file_size 449839104
innodb_open_files 300
innodb_thread_concurrency 8
innodb_thread_sleep_delay 10000
join_buffer_size 131072
key_buffer_size 2147483648
key_cache_age_threshold 300
key_cache_block_size 1024
key_cache_division_limit 100
max_allowed_packet 134217728
max_connections 800
max_delayed_threads 20
max_join_size 18446744073709551615
max_user_connections 0
myisam_max_sort_file_size 107374182400
myisam_mmap_size 18446744073709551615
myisam_sort_buffer_size 70254592
open_files_limit 2048
query_cache_limit 104857600
query_cache_min_res_unit 4096
query_cache_size 419430400
query_cache_type ON
read_buffer_size 262144
socket MySQL
sort_buffer_size 2097152
table_type InnoDB
thread_cache_size 100
thread_handling one-thread-per-connection
thread_stack 262144
tmp_table_size 1073741824
質問で目標を明確に述べた
目標は、MyISAMテーブルでの検索のパフォーマンスを大幅に向上させることです
では、MyISAM側を調整しましょう。
4つの提案があります
まず、5年前を振り返り、投稿に対する回答で私が言ったことに注意してください InnoDBとMyISAMの主な違いは何ですか? :MyISAMストレージエンジンは、.MYI
からのインデックスページのみをキャッシュしますMyISAMテーブルの。
key_buffer_size
を2147483648
、つまり2Gに設定します。それでも、MyISAMは合計で718Mしかインデックス付けしません。 1.2GのRAMを解放するには、key_buffer_size
を768M
に減らす必要があります。
多くの人はこれを認識していませんが、MyISAMテーブルからRAMに1つ以上のインデックスをロードできます。専用のキーキャッシュと呼ばれます。 3.5年以上前、私はこれについて投稿の回答で書きました MySQLテーブルキャッシュを部分的に無効化できますか? (提案#1を参照)。これはMySQLのドキュメントにもあります。「 キャッシュインデックスの構文 」を参照してください。
MyISAMテーブルに多数のVARCHAR
フィールドがある場合、VARCHAR
フィールドを1つのDDLコマンドでCHAR
のように動作させることができます
ALTER TABLE myisamtable ROW_FORMAT=FIXED;
これにより、テーブルが拡張され、VARCHAR(32)
のように、CHAR(32)
のデータ型が常に実際に32バイト幅になるようになります。これにより、MyISAMテーブルのサイズが2倍または3倍になる可能性がありますが、読み取り速度が20〜25%向上します。
私はこれについて何度も書いた
Mar 25, 2011
: MySQL VARCHARサイズのパフォーマンスへの影響Aug 12, 2011
: どのDBMSが超高速読み取りと単純なデータ構造に適していますか?Sep 20, 2011
: MyISAMとInnoDBのベストMay 02, 2012
: どのmysqlストレージエンジンを選択するか?May 03, 2012
: InnoDBまたはMyISAMのどちらが高速ですか?これを行う場合は、戻ってMyISAMインデックスがどれだけ大きくなったかを測定する必要があります。次に、SUGGESTION #2
をやり直し、MyISAM専用キーキャッシュをその新しいサイズに作成します。
MyISAMにはMyISAMデータのグローバルキャッシュはありませんが、各DB接続には read_buffer_size(順次読み取りの場合) および read_rnd_buffer_size(インデックス付き読み取りの場合) のローカルキャッシュサイズがあります。
read_buffer_size が256K (262144)
に設定されています。 read_rnd_buffer_size をまったく設定しなかったため、256K (262144)
のデフォルトサイズに設定されています。データのキャッシュを試すこともできますが、これら2つのMyISAMデータキャッシュはDB接続ごとにあるため、十分に注意してください。