web-dev-qa-db-ja.com

tmp_table_size(ほとんどがInnoDBテーブル)

MySQLバージョン5.6.25-0ubuntu0.15.04.1を64ビットUbuntu 15.04で使用しています。 2GB RAMで、ディスクはSSDです(したがって、私の考えでは、ディスクへの書き込みはそれほどコストがかかりません)。現在、データベースが2つしかないWordpressブログ。私はこれを最適化することにあまり深く入り込むことを試みていませんでしたが、私は奇妙な振る舞いと思われるものに遭遇しました。

MySQLTuner 1.5.0を実行すると、次の出力が表示されます。

[OK] Currently running supported MySQL version 5.6.25-0ubuntu0.15.04.1
[OK] Operating on 64-bit architecture

-------- Storage Engine Statistics-------------------------------------
[--] Status: +ARCHIVE +BLACKHOLE +CSV -FEDERATED +InnoDB +MRG_MYISAM
[--] Data in InnoDB tables: 7M (Tables: 30)
[!!] Total fragmented tables: 3

-------- Performance Metrics -----------------------------------------
[--] Up for: 10d 13h 0m 49s (86K q [0.095 qps], 3K conn, TX: 218M, RX: 26M)
[--] Reads / Writes: 73% / 27%
[--] Binary logging is disabled
[--] Total buffers: 296.0M global + 1.1M per thread (75 max threads)
[OK] Maximum reached memory usage: 302.8M (15.20% of installed RAM)
[OK] Maximum possible memory usage: 380.4M (19.10% of installed RAM)
[OK] Slow queries: 0% (0/86K)
[OK] Highest usage of available connections: 8% (6/75)
[OK] Aborted connections: 0.34%  (11/3243)
[!!] Key buffer used: 18.2% (1M used / 8M cache)
[OK] Key buffer size / total MyISAM indexes: 8.0M/109.0K
[OK] Read Key buffer hit rate: 96.7% (30 cached / 1 reads)
[OK] Query cache efficiency: 45.3% (27K cached / 60K selects)
[OK] Query cache prunes per day: 0
[OK] Sorts requiring temporary tables: 0% (0 temp sorts / 1K sorts)
[!!] Temporary tables created on disk: 81% (2K on disk / 2K total)
[OK] Thread cache hit rate: 99% (6 created / 3K connections)
[OK] Table cache hit rate: 76% (115 open / 150 opened)
[OK] Open file limit used: 0% (48/16K)
[OK] Table locks acquired immediately: 100% (41K immediate / 41K locks)

-------- InnoDB Metrics ----------------------------------------------
[--] InnoDB is enabled.
[OK] InnoDB buffer pool / data size: 128.0M/7.4M
[OK] InnoDB buffer pool instances: 1
[!!] InnoDB Used buffer: 15.19% (1244 used/ 8191 total)
[OK] InnoDB Read buffer efficiency: 99.93% (1295836 hits/ 1296742 total)
[!!] InnoDB Write buffer efficiency: 0.00% (0 hits/ 1 total)
[OK] InnoDB log waits: 0.00% (0 waits / 12926 writes)

-------- Recommendations ---------------------------------------------
General recommendations:
    Run OPTIMIZE TABLE to defragment tables for better performance
    When making adjustments, make tmp_table_size/max_heap_table_size equal
    Reduce your SELECT DISTINCT queries without LIMIT clauses
Variables to adjust:
    tmp_table_size (> 128M)
    max_heap_table_size (> 128M)

私の問題は、tmp_table_size(およびmax_heap_table_size)です。毎週私はそれを増やしており、MySQLTunerはより大きな値を提案し続けています。 (ご覧のとおり、現在は128Mを超える値が提案されています。)上記の出力から、ディスクにテーブルを書き込んでいることがわかります。これが提案の理由だと思います。ただし、私の理解では、これはMyISAMエンジンにのみ関連しますが、私のWordpressテーブルはすべてInnoDBエンジンを使用しています。MyISAMを使用している可能性のある内部MySQLテーブルがいくつかあると思いますが、 MySQLTunerが、その最小限のものだけのために、こんなに大きなテーブルサイズが必要だと思っている理由はまだわかりません。

だから、質問:MySQLTunerは、InnoDBだけを使用するのに、なぜそんなに大きな一時テーブルが必要だと思うのですか?

2
Eric Marsh

あなたのmysqlはまだディスクテーブルを作成しているので:[!!] Temporary tables created on disk: 81% (2K on disk / 2K total)

source of tuner-script を見る

$mycalc{'pct_temp_disk'} = int(($mystat{'Created_tmp_disk_tables'} / $mystat{'Created_tmp_tables'}) * 100);

*snip*

if ($mycalc{'pct_temp_disk'} > 25 && $mycalc{'max_tmp_table_size'} < 256*1024*1024) {
    badprint "Temporary tables created on disk: $mycalc{'pct_temp_disk'}% (".hr_num($mystat{'Created_tmp_disk_tables'})." on disk / ".hr_num($mystat{'Created_tmp_tables'})." total)\n";
    Push(@adjvars,"tmp_table_size (> ".hr_bytes_rnd($myvar{'tmp_table_size'}).")");
    Push(@adjvars,"max_heap_table_size (> ".hr_bytes_rnd($myvar{'max_heap_table_size'}).")");
    Push(@generalrec,"When making adjustments, make tmp_table_size/max_heap_table_size equal");
    Push(@generalrec,"Reduce your SELECT DISTINCT queries without LIMIT clauses");
} elsif ($mycalc{'pct_temp_disk'} > 25 && $mycalc{'max_tmp_table_size'} >= 256*1024*1024) {
    badprint "Temporary tables created on disk: $mycalc{'pct_temp_disk'}% (".hr_num($mystat{'Created_tmp_disk_tables'})." on disk / ".hr_num($mystat{'Created_tmp_tables'})." total)\n";
    Push(@generalrec,"Temporary table size is already large - reduce result set size");
    Push(@generalrec,"Reduce your SELECT DISTINCT queries without LIMIT clauses");

したがって、(Created_tmp_disk_tables/Created_tmp_tables)* 100が25(%)を超える場合は、チューナーのロジックがあり、tmp-tableサイズを増やします(最大256Mまで)。

繰り返しになりますが、mysqltunerは参照用です。パフォーマンスの問題が見られない場合は、盲目的に提案に従う必要はありません。

また、tmpテーブルはInnoDBとMyISAMとは関係がないことにも注意してください(最後の行で意味している場合)。 内部一時テーブル についてお読みください。

1
mysql_user

意味が理解できない限り、mysqltunerからの提案を使用しないでください。ほとんどの場合、それらはナンセンスです。

マニュアルをカバーするページがあります tmpテーブルの内部使用 。簡単な概要を説明します。

  • 自動的に作成されたディスク上のテーブルはMyISAMエンジンを使用します。これをInnoDB afaikに変更することはできません。メモリ内のものはMEMORYエンジンを使用します
  • クエリはおそらくほとんどがディスク上の一時テーブルを使用しますが、tmp_table_sizemax_heap_table_sizeの値は、テーブルをメモリ内に作成できるかどうかを決定するための唯一の制限ではありません-MEMORYエンジンは一部の機能をサポートしていません一時テーブル(BLOB/TEXT列、SELECTまたはGROUP BY ..のvarcharsが長すぎる)で必要になる場合があるため、一部のクエリでは、一時的なディスク上のテーブルを作成せずにそれらを実行することは不可能です。

おそらくWordpressは、MySQLがほとんどの場合MEMORYエンジンを実際に使用する機会がないようなクエリとテーブルを使用します。

1
jkavalik