2007年10月21日
MySQL4でテーブルパーティショニング
チックなことをMERGEテーブル(MRG_MyISAM)を使ってやってみたので備忘録。
まず制限事項
・REPLACE構文が使用不可
ついでに圧縮テーブルの制限事項
・読み取り専用になる
構成としては
A
├A000
├A001
└A002
AはMERGEテーブルなので実データはない。
A000がアクティブテーブル、A001,A002はいわゆるアーカイブ。
なので、A001とA002は圧縮テーブルを使用してみる。
A000のデータが一定量を超えたらAXテーブルに移動して、MERGEテーブル
をリビルドするローテートの部分は手動か、別途シェルでも作成する
必要がある。
ローテートサイズは、テーブル構成やサーバ性能にもよるが、データサイズで200Mとか。
(200*1024*1024)/AVG_ROW_LENGTH=ローテートレコード数
以下AAテーブルを上記構成にした時の作業ログ。
mysql>SHOW TABLE STATUS LIKE AA \G
で、テーブル構成を調べられる。
※AAテーブルは500Mbyte、150万レコード、AVG_ROW_LENGTH:140
分割レコード数は60万
mysql>CREATE TABLE A001 SELECT * FROM AA LIMIT 0,600000;・A002
mysql>CREATE TABLE A002 SELECT * FROM AA LIMIT 600000,600000;・A000
mysql>CREATE TABLE A000 SELECT * FROM AA LIMIT 1200000,600000;■テーブル圧縮 cd 「AAテーブルデータが格納されているディレクトリ」
myisampack -v A001
myisamchk -rq --analyze --sort-index A001.MYI
myisampack -v A002
myisamchk -rq --analyze --sort-index A002.MYI
※テーブルを圧縮した後に必ずインデックスをリビルドしておかないとエラーになる。
参考速度:テーブルデータ:235M、インデックスデータ52Mの場合で37s,18s
@CPU:Xeon5110*2,Memory:4G,HDD:SAS 15Krpm*2(RAID-1)
圧縮率は約50%程。
■マージテーブル作成mysql>SHOW CREATE TABLE AA;でDDL作成して、MERGEテーブル用に修正すると
CREATE TABLE A (........) DEFAULT CHARSET=utf8となる。
ENGINE = MERGE
UNION = (A001,A002,A000) INSERT_METHOD = LAST
※AUTO_INCREMENTは値指定無しでも自動的に最後尾に追加される
アクティブテーブルが閾値を超えた場合は、A003テーブルにローテート後、
MERGEテーブルを再構築(DROP、CREATE)する。

