MySQL MERGEストレージエンジンの概要

2211 ワード

MERGEストレージエンジンは、MyISAMデータテーブルのセットを論理ユニットとして扱い、同時にクエリーを行うことができます.1つのMERGEデータテーブル構造を構成する各メンバーMyISAMデータテーブルは、完全に同じ構造を有しなければならない.各メンバー・データ・テーブルのデータ・カラムは、同じ名前とタイプを同じ順序で定義する必要があります.インデックスも同じ順序で定義する必要があります.
いくつかのログ・データ・テーブルがあるとします.この数年間のログ・レコード・アイテムの内容は次のように定義されています.YYは年を表します.
CREATE TABLE log_YY
(
  dt  DATETIME NOT NULL,
  info VARCHAR(100) NOT NULL,
  INDEX (dt)
) ENGINE = MyISAM;

ログ・データ・テーブルの現在のセットにlog_が含まれていると仮定します.2004、log_2005、log_2006、log_2007年には、次のようなMERGEデータテーブルを作成して論理ユニットにまとめることができます.
CREATE TABLE log_merge
(
    dt DATETIME NOT NULL,
    info VARCHAR(100) NOT NULL,
    INDEX(dt)
) ENGINE = MERGE UNION = (log_2004, log_2005, log_2006, log_2007);

ENGINEオプションの値はMERGEでなければなりません.UNIONオプションには、このMERGEデータテーブルに収録される各関連データテーブルがリストされています.
このMERGEを作成すると、他のデータ・テーブルのようにクエリーできますが、クエリーごとにメンバー・データ・テーブルごとに同時に機能します.次のクエリでは、上記のログ・データ・テーブルのデータ行の合計数を示します.
SELECT COUNT(*) FROM log_merge;

次のクエリは、ここ数年で毎年どのくらいのログ・レコードがあるかを決定するために使用されます.
SELECT YEAR(dt) AS y, COUNT(*) AS entries FROM log_merge GROUP BY y;

複数のクエリーを発行せずに複数のデータ・テーブルを同時に参照するのに便利なほか、MERGEデータ・テーブルには以下のような便利さがあります.
  • MERGEデータテーブルは、各MyISAMデータテーブルが許容する最大長を超えるサイズの論理ユニット
  • を作成するために使用することができる.
  • 圧縮されたデータテーブルがMERGEデータテーブルに含まれているのを見てください.たとえば、ある年が終わると、対応するログファイルにレコードを追加しないはずです.myisampackツールで圧縮してスペースを節約できますが、MERGEデータテーブルはいつものように
  • で動作します.
    MERGEデータテーブルもDELETEとUPDATE操作をサポートしています.INSERTの操作は面倒です.MySQLは新しいデータ行をどのメンバー表に挿入すべきかを知る必要があります.MERGEデータテーブルの定義にINSERT_を含めることができますMETHODオプション、このオプションの値はNO、FIRST、LASTであり、INSERT操作が禁止されていることを意味し、新しいデータ行が現在のUNIONオプションにリストされている最初のデータテーブルまたは最後のデータテーブルに挿入される.たとえば、以下の定義はlog_mergeデータテーブルのINSERT操作は対log_とする2007データテーブル:UNIONオプションにリストされた最後のデータテーブルです.
    CREATE TABLE log_merge
    (
        dt DATETIME NOT NULL,
        info VARCHAR(100) NOT NULL,
        INDEX(dt)
    ) ENGINE = MERGE UNION = (log_2004, log_2005, log_2006, log_2007)
    INSERT_METHOD = LAST;

    新しいメンバーデータテーブルlog_を作成2009年に同じテーブル構造を持たせ、logを変更します.mergeデータテーブルlog_2009に含める:
    log_2009:
    CREATE TABLE log_2009 LIKE log_2008;
    ALTER TABLE log_merge
    UNION = (log_2004, log_2005, log_2006, log_2007,log_2008,log_2009);