6690 マージテーブル実装 はくぶん 2015-06-16 07:17:02
マージテーブルを実装してみた。
感想は、思ったほど速くも遅くもならない、ということ。
単に分割したテーブルを繋げているだけだな、という印象。

しかし、各テーブルを分割したまま扱えるのは便利。
例えば、5年分くらいのアクセスログがあるとして、それが一つのテーブルに収まってると、読み書きを一つのテーブルでしなければならない。
しかし、テーブルが年毎に分散されていると、今年のテーブルに新規ログを書き込んでる裏で、4年前のレコードを集計したりもできる。
一つのテーブルではできない分業が可能となるのだ。

技術者によっては、このテーブル一つ分をメモリに丸々収まる大きさに切り分け、すべてのテーブルをメモリ上にロードして運用してる例もあるらしい。
ディスクにデータを参照しに行かなくて済むから、全体としてかなりのスピードアップに繋がるようだ。
ただ、それなりにサーバの台数も要るので、素人が出来る技ではないのだが。

しかし、この話、発想次第ではこの自宅サーバのような小さな環境でも、何かに応用できるかもしれない。
マージテーブルとは、それだけ未知の可能性を秘めた、用途の広い技術だということだろう。

取りあえず年毎にログを分割してみた。
もうちょっと調整の必要もあるが、先ず何よりログテーブルの入れ替えシステムを作らないといけない。
と言うのも、新しい年に変わる際には必ずテーブルが一つ増えることになるので、マージテーブルを再構築しなければならないのである。
現在、マージテーブルは2008年から2015年まで8つのログテーブルを連結しているが、2016年のテーブルが増えても、マージテーブルを再構築しない限り、そのテーブルはマージテーブルには取り込まれないのである。
手動でやってもいいのだが、これが結構面倒、というより、注意点がいくつもあるので、それを見落とさないようにするためには、今の時点ですべてを自動化してしまった方が、早くて安全だろうと思うからだ。
元日の深夜にそんな面倒な作業をしたくないという意味合いもある。

ここで一つ、あるサイトで指摘されていた重要項目を、備忘録として記しておこう。
マージテーブルを作る際、記述部分の後半は、
ENGINE=MRG_MyISAM UNION=(連結する基テーブルたち) INSERT_METHOD=FIRSTかLAST
と説明されている。
しかし、
DEFAULT CHARSET=utf8
の項目は必ず入れること。
マニュアルには載っていないが、これを入れないと、エラー1168が返って来る場合がある。
ERROR 1168 (HY000): Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist.
こんなエラー文だが、俺も出た。
訳すと、マージテーブル内の基テーブルに関して、マージテーブルと定義が違うため、またはMyISAMタイプじゃないため、もしくは存在しないため、(マージテーブルを通して)基テーブルが開けない、と言っているのである。
処理の内容がエラーなのではなく、基テーブルにCHAR型カラムがあると、マージテーブルがカラム定義を判断できず、その結果このエラーとなるようだ。
それを回避するために、ちゃんと文字コードを記述した方がいいとのこと。
基テーブルにCHAR型カラムが含まれていなければ、文字コードを指定しなくても大丈夫らしいが、CHAR型を含まないテーブル構成があり得るかどうか。
少なくとも俺の場合はあり得ないので、これは毎回入れることにした。
この件に関する詳しい内容はこちらのページで。
メッセージ文字数:1521/1626