多くのmysql一時テーブルを同時に作成するのは悪いことですか?


8

一部のデータをユーザーに提供するために、重い統計分析を行う必要があります。現在、私はmysqlからデータをキャッチし、PHP配列を介して処理しています。ただし、mysql一時テーブルの方がはるかに優れています(PHP配列よりもはるかに効率的で高速です。そのメカニズムにより)。

私の暫定的な解決策は、データをインポートして処理するための各要求(つまり、接続)時に一時テーブルを形成することです。しかし、多くの一時テーブルを同時に作成することの欠点があるかどうかはわかりませんか?

これはmysqlサーバーに問題を引き起こす可能性がありますか?または、多数の同時リクエストでPHP配列の代わりとして使用できますか?

回答:


6

一時テーブルをできるだけ作成したくない場合:一時テーブルへのコピーを禁止(SQL)

MySQLレプリケーションではうまく機能しません:MySQL一時テーブルのバイナリログはどのように更新されますか?

一時テーブルはDBの世界では現実のものであるため、その存在に対応するために、通常とは異なる変更を行う必要がある場合があります。

通常、mysqldには、tmpdirが設定されている/tmp場所またはどこにでもtmpテーブルを配置する癖があります。これは通常、疑いを持たない一部のディスクで発生します。

興味深い代替案は、RAMディスクをセットアップし、それを使用するようにtmpdirを再構成することです。

ステップ01:RAMディスクのマウントポイントを作成する

mkdir /var/tmpfs

ステップ02:RAMディスクを/ etc / fstab(16GB)に追加します

echo "none   /var/tmpfs              tmpfs   defaults,size=16g        1 2" >> /etc/fstab

ステップ03:この行を/etc/my.cnfに追加します

[mysqld]
tmpdir=/var/tmpfs

ステップ04:RAMディスクを有効にする

次のいずれかを実行できます。

  1. DBサーバーを再起動するだけです
  2. mount -t tmpfs -o size=16g none /var/tmpfs

これを行う前に、十分なRAMがあることを確認してください

試してみる !!!


2
暗黙的な一時テーブルは、SBRかRBRかにかかわらず、レプリケーションに影響を与えません。 明示的な一時テーブルは、すべてのDDLをネットワーク経由で送信します。
リックジェームズ

4

「多くのmysql一時テーブル」-潜在的な問題:

  • table_open_cache(およびその他の調整可能パラメータ)-制限に達する可能性があります(そうなる可能性は低いです)
  • Ramの肥大化-より多くのRAMを使用することができます(ただし、そうする可能性は低いです)。これがスワッピングにつながる場合、それは本当に悪いです。

あなたが本当に一度に何百もの一時テーブルを持っていない限り、私は「多く」を心配しません。

一度にいくつのスレッド(SHOW PROCESSLIST; 'Sleep'を無視)が実行されていますか?忙しいシステムであっても、一度に10を超えることはめったにありません。

暗黙的な一時テーブルについては、それらを引き起こしているSELECTを見てみましょう。一時テーブルを回避するためにクエリを再設計できる場合があります。

RAMディスクを使用するのは好きではありません。RAMディスクを他のキャッシュの可能性から遠ざけ、ハードリミット(ディスクサイズ)に達するリスクがあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.