MySQL 5.1 リファレンスマニュアル :: 13 ストレージエンジンとテーブルタイプ :: 13.6 MERGE ストレージエンジン :: 13.6.1 MERGE テーブルの問題点
« 13.6 MERGE ストレージエンジン

13.7 MEMORY (HEAP) ストレージエンジン »
Section Navigation      [Toggle]
  • 13.6 MERGE ストレージエンジン
  • 13.6.1 MERGE テーブルの問題点

13.6.1. MERGE テーブルの問題点

既に分かっている MERGE テーブルの問題点は次のような物です。

  • MERGE テーブルを別のストレージエンジンに変える為に、ALTER TABLEテーブルを利用すると、基礎となるテーブルへの位置付けが失われます。その代わりに、基礎となる MyISAM テーブルのレコードが変化したテーブルにコピーされ、そしてそれは指定されたストレージエンジンを利用します。

  • REPLACE は機能しません。

  • MERGE テーブルは領域確保をサポートしません。これは、MERGE テーブルも、MERGE テーブルの基礎となる MyISAM テーブルも領域確保ができないという事です。

  • 開いているMERGE テーブルにマップされた全てのテーブルに対して、 WHERE 条項、 REPAIR TABLE、 TRUNCATE TABLE、 OPTIMIZE TABLE、また ANALYZE TABLEがない DROP TABLE、 ALTER TABLE、 DELETEを使う事はできません。それをすると MERGE テーブルは元のテーブルを参照する事があるので、好ましくない結果をもたらす可能性があります。このような事を防ぐのに一番簡単なのは、FLUSH TABLES ステートメントを事前に発行する事によって、全ての MERGE テーブルを閉じておくという方法です。

  • MERGE ストレージエンジンのテーブル位置づけはMySQLの上位レイヤーから隠れているので、MERGE テーブルによって使用されているDROP TABLE はWindowsでは機能しません。Windowsでは開いているファイルを削除する事はできないので、まず MERGE テーブルをフラッシュするか( FLUSH TABLESを使う)、テーブルをドロップする前にMERGE テーブルをドロップする必要があります。

  • MERGE テーブルは、そのテーブル全体に対して一意性制約を保持する事ができません。 INSERTを行う時、データは最初、または最後の MyISAM テーブルに入ります。( INSERT_METHOD オプションの値による。)MySQLは MyISAM テーブルの中では一意の値はそのまま残る事を保障しますが、全てのテーブルのコレクションの中ではそうではありません。

  • MySQL 5.1.15以降のバージョンでは、アクセスされた時にMyISAM テーブルと MERGE テーブルの定義が確認されます。(例  SELECT か INSERT ステートメントの一部として)。そのように確認する事によって、テーブル定義と親MERGE テーブル定義がカラムの順番、タイプ、サイズ、そして関連するインデックスなどに関して一致する事を保障します。テーブル間で違いがあれば、エラーが発生し、ステートメントは失敗します。

    テーブルが開かれた時にこのようなチェックが行われるので、カラム変更、カラムの順番やエンジンの入れ替え等を含む定義の変更によってステートメントが失敗します。

    MySQL 5.1.14 とそれ以前のバージョンにて

    • MERGE テーブルを修正、または作成する時、基礎となるテーブルがMyISAM テーブル内に存在し、それらが同一の構造である事を保証する為の確認は行われません。MERGE テーブルが使用される時、MySQL は全てのマップされたテーブルの行の長さが等しいかどうかを確認しますが、これは絶対間違いの無い物ではありません。異なるMyISAMテーブルから MERGE テーブルを作成すると、未知の問題に直面する可能性が高いです。

    • 同じように、MyISAM テーブル以外から MERGE テーブルを作成したり、または基礎となるテーブルをMyISAM テーブル以外にドロップしたり変更したりすると、後でMERGE テーブルを使用する時までエラーは発生しません。

    • 基礎となる MyISAM テーブルは、MERGE テーブルが作成される時には存在する必要がないので、全ての基礎となるテーブルが配置されるまでMERGE テーブルを使用しなければ、テーブルをどんな順番で作成しても構いません。また、 MERGE テーブルが与えられた時間内に使用されない事を保障できるのであれば、基礎となるテーブルのバックアップ、リストア、変更、ドロップ、または再作成などのメンテナンスを行う事ができます。基礎となるテーブルに対して作業を行っている間に、それらを除外する為に MERGE テーブルを一時的に再定義する必要はありません。

  • MERGE テーブル内と、その基礎となるテーブルのインデックスの順番は同一でなければいけません。もしMERGE テーブル内で使われるテーブルにUNIQUE インデックスを追加する為にALTER TABLEを使用し、またMERGE テーブルに一意ではないインデックスを追加するためにALTER TABLE を利用するなら、基礎となるテーブルの中に既に一意ではないインデックスがあれば、テーブルのインデックス順は異なります。(これは、 重複キーの速やかな検出を促進する為にALTER TABLE が UNIQUE インデックスを一意でないインデックスの前に置くからです。)その結果、そのようなインデックスを持つテーブルに対するクエリは予想外の結果をもたらします。

  • もし ERROR 1017 (HY000): Can't find file: 'mm.MRG' (errno: 2) と同じようなエラーメッセージが出たら、それは通常いくつかのベーステーブルがMyISAMストレージエンジンを使用していない事を表します。全てのテーブルがMyISAMである事を確認してください。

  • MyISAMにもあるように、MERGE テーブルにも232 (~4.295E+09)行の制限があります。その為、この制限を越える複数のMyISAM テーブルをマージする事はできません。しかし、 MySQLを --with-big-tables オプションで作成すると、行の制限は (232)2 (1.844E+19) 行に増加します。詳しくは項2.9.2. 「典型的な configure オプション」を参照してください。MySQL 5.0.4バージョンより、全ての標準バイナリはこのオプションで作成されます。

Copyright © 1997, 2010, Oracle and/or its affiliates. All rights reserved. Legal Notices
Top / Previous / Next / Up / Table of Contents
© 2010, Oracle Corporation and/or its affiliates