2012-01-16 2 views
5

なぜMySQLの問題が解決されるかによってMySQL SELECTが非常に遅いです。長いLONGBLOB

table xxx 
-> id primary key 
-> name varchar 255 
-> data longblob 

私は、この表に100個のファイル、各100メガバイトを保存するとき、テーブルが10ギガバイト

を持っているし、任意の行を選択しようとする...それが取る

SELECT name FROM xxx WHERE id = 50 LIMIT 1; 

取り約8秒

nameを返す前にmysqlが行全体を読み取るのはおそらく255文字だけなので、100個のファイルの名前をリストするときはm ysqlは10 GBを読み込み、約2 KBの結果を返します。

+0

あなたがそれを書くときにあなたの質問/回答のプレビューが表示されます。プレビューを見て、フォーマットが正しいことを確認してください。プレフォーマットされたコードがプレビューに1行で表示されている場合は、他の人に見えるようになります。したがって、「コードサンプル」ボタンを使用して適切にフォーマットしてください(または、各行の前に4つのスペースを入れ、SEはフォーマット済みのコードを認識します)。 –

答えて

6

ブロブを別のテーブルに分割してみてください。

はたとえば、列idname、および列iddataを含む別のテーブルxxx_dataを含むテーブルxxxを持つことができます。名前のみが必要な場合は、xxx_dataテーブルをまったくクエリする必要はありません。あなたは名前とデータの両方が必要な場合、あなたはid共有プライマリキーを使用して一緒にテーブルを結合することができます

より多くの情報や最適化のアイデアを
SELECT id, name, data 
FROM xxx JOIN xxx_data USING (id) 
WHERE id = ... 

、例えば参照します10 tips for optimizing MySQL queries

+2

これらのファイルをデータベースではなくファイルシステムに保存することを検討してください。もちろん、データベースに保存する理由は(セキュリティのように、削除しやすい、多くのサーバーに簡単に複製するなど)ですが、10個のファイルを返すことを想像してください...データベースに問い合わせて10 * 100MBラム。ファイルを返すだけで、サーバー上の1GBのRAMを消費したいのですが、サーバー上のある場所からストリームを流すことはできますか?あなたのファイルはデータベースに保存するには大きすぎると思います。 –

+1

データベースに絶対に必要なデータがない場合は、ファイルシステムに移動することもできます。私は大量のファイルや大きなファイルを扱っているときにこれがうまくいくと思います。 –

関連する問題