web-dev-qa-db-ja.com

非常に多くの一時テーブルをディスクに書き込まないようにするMySQLエンジンまたはトリックはありますか?

MySQLを実行しているデータベースに接続されたWebアプリケーションがあります。

問題はここにあります。無視できない数のクエリが一時テーブルを作成し、関係するテーブルの多くにBLOBフィールドがあります。これは、ディスク上に多数の一時テーブルが作成されていることを意味します(この動作はここで説明されています https://dba.stackexchange.com/a/17679/16724 )。これにより、かなりひどい結果になります。パフォーマンス。

たぶん、この問題の簡単な解決策はありますか?おそらくいくつかのフォークまたは他のプラグイン可能なエンジンですか?私は実際にはMySQL(XtraDB)のPerconaフォークを実行していますが、これはVanilla InnoDBと同じ問題です。私は率直にPostgresへの切り替えを検討しています。

ありがとう

5
Eli

そのリンクから指摘 として、すべての接続ベースの設定を適切に調整する必要があります。

あなたが速くて汚いものを探しているなら、私はただのものを持っています:

2012年11月30日に、ディスクベースの一時テーブルでさえ、一時テーブルをRAMにマッピングすることについて、素晴らしい投稿を書きました: 多くのmysql一時テーブルを同時に作成するのは悪いですか?

試してみる !!!

UPDATE 2013-01-03 22:14 EDT

BLOBに関して、お悔やみ申し上げます。それにもかかわらず、良い知らせがあります。 RAMディスクをセットアップしたら、私はあなたができる非常に汚いスタントを持っています。

準備はいいですか?

次の値を

tmp_table_size = 1K
max_heap_table_size = 1K

それは誤植ではありません。それはタイプミスではありません。 tmp_table_sizemax_heap_table_size を1Kに設定すると言いました。 「なぜこれらの値をそれほど低く設定するのですか?」

これらの値は、一時テーブルをディスクに転送する前に許可されるメモリ内の最大の一時テーブルを表します。 RAMディスクがある場合、一時テーブルはRAMディスクにできるだけ早くジャンプします。MySQLのドキュメントにあるように max_heap_table_size

メモリ内の一時テーブルが制限を超えると、MySQLはそれを自動的にディスク上のMyISAMテーブルに変換します。多くの高度なGROUP BYクエリを実行し、メモリが大量にある場合は、tmp_table_size(および必要に応じてmax_heap_table_size)の値を増やします。

4
RolandoMySQLDBA