2017-04-25 7 views
11

データベースにlargeish(InnoDB)テーブルがあります。明らかに、ユーザーはJOINを使用してSELECTを作成することができ、その結果、一時的な大きな(したがってディスク上の)表が作成されます。時には、それらは非常に大きく、ディスクスペースを使い果たし、あらゆる種類の奇妙な問題につながります。一時テーブルのサイズを制限するにはどうすればよいですか?

ディスク上のテーブルのテンポラリテーブルの最大サイズをに制限する方法はありますか?テーブルがディスクを過度に増殖させないようにするには、を使用します。 tmp_table_sizeは、名前にもかかわらず、メモリー内の表にのみ適用されます。 documentationに関連するものは見つかりませんでした。

+0

はい、*私はストレージが安いことを認識しており、最適な解決策は「クエリを防止する」ことです。しかし、それらは私が現在持っているオプションにはありません。 – Piskvor

+0

いくつかの "巨大な"クエリは、大きなtmpテーブルを避けるために再定式化できます。クエリを変更できますか?もしそうなら、関連テーブルごとに 'SELECT ...'、 'EXPLAIN SELECT ...'と 'SHOW CREATE TABLE'を指定してください。 tmpテーブルを縮小すると_probably_スピードアップします。 –

+1

クエリを最適化するためのガイドライン(https://dev.mysql.com/doc/refman/5.7/en/internal-temporary-tables.html)を以下に示します。 –

答えて

4

ありがとうございましたdisk-tmp-table-sizeについてはthe commitのように見えますが、他の理由(at least the option does not exist in the current code base anymore)で紛失してしまったようです。

私はあなたの次の最善の試み(ストレージを増やす以外にも)は、ディスク上の一時テーブルを作成しないようにMySQLを調整することだと思います。 There are some tips for this on DBA。十分なRAMがあり、ディスクストレージが不足している場合は、「オンディスク」の一時テーブルの格納用のRAMディスクを作成することもできます。

+0

10年以上で多くのことが起こる可能性があります。私は自分のサーバーでこのオプションを見つけられませんでした。 RAM内の提案をありがとうございますが、残念ながら、250 GBの一時テーブルの場合、これは「ディスクを取得」する可能性は低いです。 – Piskvor

+0

これは今のところ唯一の選択肢のようです。私もそれについてのより多くの情報を見つけることができませんでした。 –

+0

ええ、私も。それゆえ奨励金。 – Piskvor

1

MariaDBとMySQLにはこのオプションはありません。 私は数ヶ月前と同じ問題に遭遇しました。私は多くを検索しましたが、一時的なデータセットのためにNAS上に特別なストレージ領域を作成することによって、部分的に解決しました。

あなたのNASまたは内蔵HDDのパーティションにフォルダを作成すると、定義されたサイズに制限されてマウントされ、mysql iniでこのドライブに一時ストレージを割り当てます(windows/linux)

tmpdir="mnt/DBtmp/" 
tmpdir="T:\" 

この変更後、mysqlサービスを再起動する必要があります。

この方法では、ドライブがいっぱいになっても、ディスク上のクエリで「奇妙な問題」が発生しますが、他の問題はなくなりました。

+0

完全な解決策ではありませんが、これは唯一の実行可能な回避策のようです。ありがとうございました。 – Piskvor

関連する問題