一時テーブルをMyISAMテーブルとしてマテリアライズしたり、遅延させるように構成したりできるオプションがいくつかあります。ディスクベースの一時テーブルの.frm
場合、ファイルは存在せず.MYD
、.MYI
ファイルのみが存在することに注意してください(もちろん、内部一時テーブルにインデックスを付けることができないため、.MYIファイルは決して使用されません)。
オプションは次のとおりです。
また、内部一時テーブルの使用に関するMySQLドキュメントを検討する必要があります。
インメモリ一時テーブルが作成される状況は次のとおりです。
- ORDER BY句と別のGROUP BY句がある場合、またはORDER BYまたはGROUP BYに結合キューの最初のテーブル以外のテーブルの列が含まれている場合、一時テーブルが作成されます。
- DISTINCTとORDER BYを組み合わせると、一時テーブルが必要になる場合があります。
- SQL_SMALL_RESULTオプションを使用する場合、クエリにディスク上のストレージを必要とする要素(後述)も含まれていない限り、MySQLはメモリ内の一時テーブルを使用します。
メモリ内の一時テーブルが(tmp_table_sizeまたはmax_heap_table_size)の最小値を超えると、mysqldは次のことを行います。
- クエリを一時停止します
- インメモリテーブルの内容をMyISAM一時テーブルにコピーします
- インメモリテーブルを破棄します
- クエリを続行し、一時データをMyISAM一時テーブルに送信します
インメモリ一時テーブルがディスクのためにバイパスされる状況は、
- テーブル内のBLOBまたはTEXT列の存在
- 512バイトを超えるGROUP BYまたはDISTINCT句の列の存在
- UNIONまたはUNION ALLが使用されている場合、SELECTリストに512バイトを超える列が存在する
ディスク上の一時テーブルの作成を減らすには、ある程度の注意が必要です
- join_buffer_sizeを大きく設定する
- sort_buffer_sizeを大きく設定する
- tmp_table_sizeとmax_heap_table_sizeを大きく設定する
- 一時テーブルを最小化または防止するためのクエリのチューニング
- インデックスを作成して、個々のテーブルから事前にソートされたデータのビューを作成する
- 大きなメモリ内一時テーブルに対応するための追加のRAMのインストール
このような十分な注意を払った後も、ディスク上に一時テーブルがまだ形成されている場合は、1つの必死の動きがあります。ディスクベースの一時テーブルの作成をメモリにマッピングすることです。
tmpdirを使用して16GBのRAMディスクを設定する簡単な方法は次のとおりです
STEP01)RAMディスクフォルダーの作成
mkdir /var/mysql_tmpfs
STEP02)これを追加 my.cnf
[mysqld]
tmpdir=/var/mysql_tmpfs
STEP03)/ etc / fstabに追加します
echo "none /var/mysql_tmpfs tmpfs defaults,size=16g 1 2" >> /etc/fstab
STEP04)/ etc / fstabをリロードします
mount -a
STEP05) service mysql restart
この後、MyISAMになるすべての一時テーブルがRAMディスクに書き込まれます。これにより、ディスクベースの一時テーブルの作成が高速化されます。
試してみる !!!
filesort
であると思います。6405は、異なるサーバーインスタンスの一時ファイルを個別に保持するためのmysqlのPIDです。