0

私は自己コーディングされた PHP-MySQL サイトを実行しており、以下の構成でクエリキャッシュを有効にしています。

query_cache_type = 1
query_cache_size = 20M
query_cache_limit = 4096
query_cache_min_res_unit = 4096

tmp_table_size = 512M
max_heap_table_size = 512M

上記の構成を次のように読み取ることができます。

  • クエリキャッシュが有効になっています
  • 結果サイズが 4096 バイトを超えるクエリをキャッシュしない
  • バッファに収容できるクエリの合計は、約 5000 件のクエリ結果です (20MB/4KB = 5000)

tmp_table_sizeまたはmax_heap_table_sizeがキャッシュのクエリにどのように役立つかわかりません。これらの変数は、メモリまたはディスク (必要な場合) に作成された一時テーブルに関連しています。

innodb_buffer_pool_size = 4G
innodb_buffer_pool_instances = 4

システムには 32 GB のメモリがあり、ほとんどの場合、ほぼ 50% のメモリが空です。そのため、 innodb_buffer_pool_sizeを 4Gに設定しました。データベースのサイズは約 900MB で、1 日あたり約 2MB 増加しています。

mysqltuner ユーティリティで次の出力を取得しています

Key buffer hit rate: 69.3%
Temporary tables created on disk: 75%
Query cache efficiency: 5.9%

間違った構成を設定したようです。改善すべき点を教えてください。

4

1 に答える 1

0

一時テーブル (のSELECTs) は、複数の理由でディスク上に配置されます。

  • SELECTリストにはTEXTまたはBLOB列 (または大きなVARCHARまたはVARBINARY)が含まれます
  • tmp_table_sizetmp テーブルがまたはのいずれかより大きいmax_heap_table_size

「クエリキャッシュ」は別の動物です。最初に、次の場合にのみ役立つことに注意してください。

  • 同じ SELECTことが実行されており
  • SELECT結果セットがキャッシュされてから、テーブルが変更された書き込みはありません。
  • (あなたが言及したような)さまざまな制限を超えていません。

Query cache efficiency: 5.9%-- QC はあまり役に立ちません。私はそれをオフにすることを主張します。(これがたとえば 70% を下回る場合はオフにします。)

ディスク上に tmp テーブルを作成することは、世界の終わりではありません。

SHOW GLOBAL STATUS;

次にCreated_tmp_disk_tables/Uptime、有益です。おそらく、サーバーの 10% だけがゼロの値を持っています。80% の値は 1/秒未満です。ディスク上に tmp テーブルを作成する頻度はどれくらいですか?

おそらく mysqltuner はこれを計算しています:

Created_tmp_disk_tables / (Created_tmp_disk_tables + Created_tmp_tables)

その場合、75% は非常に高いことに同意します。2%が望ましいでしょう。

Key buffer hit rate: 69.3%MyISAM のインデックス作成について話しています。MyISAM または InnoDB を使用していますか? MyISAM を使用している場合、 の値はkey_buffer_size? これは無関係である可能性があります。管理目的の MyISAM アクティビティが少量あります。

本当の質問に戻る-- 遅いクエリを高速化したい。おそらくディスクにあふれているいくつかのクエリと、SHOW CREATE TABLE. それはいくつかの簡単な修正かもしれません。

設定のより完全な分析が必要な場合は、機械可読バージョンのSHOW VARIABLES;とを提供してくださいSHOW GLOBAL STATUS;

于 2015-06-29T17:25:36.843 に答える