web-dev-qa-db-ja.com

MyISAMのMySQLパフォーマンスチューニング

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
2
rho

質問で目標を明確に述べた

目標は、MyISAMテーブルでの検索のパフォーマンスを大幅に向上させることです

では、MyISAM側を調整しましょう。

4つの提案があります

提案#1:RAMを減らす

まず、5年前を振り返り、投稿に対する回答で私が言ったことに注意してください InnoDBとMyISAMの主な違いは何ですか? :MyISAMストレージエンジンは、.MYIからのインデックスページのみをキャッシュしますMyISAMテーブルの。

key_buffer_size2147483648、つまり2Gに設定します。それでも、MyISAMは合計で718Mしかインデックス付けしません。 1.2GのRAMを解放するには、key_buffer_size768Mに減らす必要があります。

提案#2:すべてのMyISAMインデックスをRAMにロードする

多くの人はこれを認識していませんが、MyISAMテーブルからRAMに1つ以上のインデックスをロードできます。専用のキーキャッシュと呼ばれます。 3.5年以上前、私はこれについて投稿の回答で書きました MySQLテーブルキャッシュを部分的に無効化できますか? (提案#1を参照)。これはMySQLのドキュメントにもあります。「 キャッシュインデックスの構文 」を参照してください。

提案#3:すべてのVARCHARをCHARに拡張する

MyISAMテーブルに多数のVARCHARフィールドがある場合、VARCHARフィールドを1つのDDLコマンドでCHARのように動作させることができます

ALTER TABLE myisamtable ROW_FORMAT=FIXED;

これにより、テーブルが拡張され、VARCHAR(32)のように、CHAR(32)のデータ型が常に実際に32バイト幅になるようになります。これにより、MyISAMテーブルのサイズが2倍または3倍になる可能性がありますが、読み取り速度が20〜25%向上します。

私はこれについて何度も書いた

これを行う場合は、戻ってMyISAMインデックスがどれだけ大きくなったかを測定する必要があります。次に、SUGGESTION #2をやり直し、MyISAM専用キーキャッシュをその新しいサイズに作成します。

提案#4

MyISAMにはMyISAMデータのグローバルキャッシュはありませんが、各DB接続には read_buffer_size(順次読み取りの場合) および read_rnd_buffer_size(インデックス付き読み取りの場合) のローカルキャッシュサイズがあります。

read_buffer_size256K (262144)に設定されています。 read_rnd_buffer_size をまったく設定しなかったため、256K (262144)のデフォルトサイズに設定されています。データのキャッシュを試すこともできますが、これら2つのMyISAMデータキャッシュはDB接続ごとにあるため、十分に注意してください。

試してみる !!!

7
RolandoMySQLDBA