SQLのバイナリデータアップロードにおける限界

MySQLではMyISAMテーブルにおいて1テーブルのデータサイズに限界がある。
Mysql3.22までは4G制限だったが、現在のMySQLでは 800万テラバイト(2^63 バイト)と実質限界が存在しない。
だがしかし、今度はOSのラージファイルサポートの問題があり、1テーブルにつき一般的なLinuxでは2Gの限界がある

http://dev.mysql.com/doc/refman/4.1/ja/table-size.html

  • 以下サイトより引用
Linux-Intel 32-bit 2 GB、LFS 使用の場合はそれ以上
Linux-Alpha 8 TB(?)
Solaris 2.5.1 2 GB(パッチにより 4GB まで可)
Solaris 2.6 4 GB(フラグにより変更可能)
Solaris 2.7 Intel 4 GB
Solaris 2.7 UltraSPARC 512 GB
が、これはあくまでMyISAMテーブルの場合。

じゃあ、大きなファイルはファイルとしてローカルにファイル保存するべきかといわれるとそうでもない。
InnoDBテーブルで保存すると8k〜64kbyteのデータベースページとして保存される。
これにより、ファイル数制限*8*84kbyteが上限となる。
http://dev.mysql.com/doc/refman/4.1/ja/innodb-restrictions.html
設定によって結構パフォーマンスがかわるようでしっかりやったほうがよさげ
http://mysql.holywar.net/doc/refman/5.1/ja/innodb-configuration.html

わかった事

  • とりあえずMyISAMのテーブルにLBLOBを突っ込んだりはやめたほうがいい
  • バイナリは単体で別テーブルをInnoDBとして作成し、保存したIDをMyISAMのテーブルに保存するのが良い
  • acts_as_attachmentのセットアップ手順でMigrationするとちゃんとバイナリデータだけ別テーブルにInnoDBとして作成されるので安心。

以下にも情報あり
http://q.hatena.ne.jp/1164104844