8.mysql mergeの使い方

3432 ワード

Mysqlデータベースでは、Mergeテーブルがビューに似ています.mysqlのmergeエンジンタイプでは、多くの構造の同じテーブルを1つのテーブルに統合できます.その後、複数のテーブルから返される結果は、1つのテーブルから返される結果のようにクエリーを実行できます.各集計テーブルには、完全に同じテーブルの定義と構造が必要です.
Mysql Mergeテーブルの利点:
A.静的及び動的データの分離
B.構造が近いデータを利用してクエリーを最適化する
C.より少ないデータへのアクセスが可能
D.ビッグデータセットのメンテナンスが容易
E.修正できる.mrgファイルでMergeテーブルを変更するには、もちろんalterで変更することもできますが、変更後はFLUSH TABLESでテーブルキャッシュをリフレッシュすることで、サブテーブルを動的に増加させることができます.
mergeテーブルストレージエンジンは、次のような使用場面で最も役立ちます.
MySQLデータベースにログを記録し、毎日、毎週、または毎月単一のテーブルを作成し、複数のテーブルからの合計クエリーを作成する必要がある場合は、MERGEテーブルが有効です.しかし、この機能には限界がある.MyISAMテーブルを統合するしかなく、同じテーブル定義の制限を厳格に守らなければなりません.これは大きな問題のように見えますが、InnoDBなどの別のテーブルタイプを使用する場合は、このマージは必要ありません.
次の表を定義します.
基本テーブル:
CREATE TABLE TEST_MERGE_1(
ID INT(5) NOT NULL,
VALUE VARCHAR(100) NOT NULL,
PRIMARY KEY(ID)
);
CREATE TABLE TEST_MERGE_2(
ID INT(5) NOT NULL,
VALUE VARCHAR(100) NOT NULL,
PRIMARY KEY(ID)
);
MERGE表:
CREATE TABLE TEST_MERGE(
ID INT(5) NOT NULL,
VALUE VARCHAR(100) NOT NULL,
PRIMARY KEY(ID)
) TYPE=
MRG_MyISAM INSERT_METHOD=LAST UNION=(TEST_MERGE_1,TEST_MERGE_2);
説明:
1.このテーブル構造は、カラム名、順序など、基本テーブルと完全に一致する必要があります.UNIONテーブルは同じDATABASEである必要があります.
2.この表はSQLのunionメカニズムと似ています.
3.基本テーブルタイプはMyISAMでなければなりません.
4.修正することができる.mrgファイルはMERGEテーブルを変更し、各基本テーブルの名前が1行を占めます.注意:変更後は、FLUSH TABLESでテーブルキャッシュをリフレッシュします.
5.基本テーブルへの変更は、このテーブルに直接反映されます.
6. INSERT_METHODの値は、UNIONに挿入された最初のテーブルLASTがUNIONに挿入された最後のテーブルに挿入されることを許可しない(0はNOに変えることができる)FIRSTであってもよい.(4.0以降使用可能)
7.定義上の制約は何の役にも立たず、制約は基本テーブルによって制御されます.たとえば、2つの基本テーブルに同じキー値が存在する場合、MERGEテーブルには同じキー値が2つあります.
注意:
1.修正する場合.mrgファイルでMERGEテーブルを変更する場合は、必ず変更してFLUSH TABLESでテーブルキャッシュをリフレッシュしなければなりません.そうしないと、変更は有効になりません.最近こんな間違いを犯したことがある.
2.データ量、クエリー量が多い場合は、Oracleのようなテーブルパーティションの機能を達成するためにMergeテーブルを使用しないでください.パフォーマンスに影響します.私の感覚はunionとほぼ等価です.
3.クエリの結果および順序は、Mergeテーブルを作成するときの結合テーブルの順序に関係します.
次の2つの文があるとします.
INSERT INTO TEST_MERGE_1(ID,VALUE) VALUES(1,'ciray');
INSERT INTO TEST_MERGE_2(ID,VALUE) VALUES(1,'blog.csdn.net/ciray');
次に、このクエリ:
SELECT * FROM TEST_MERGE WHERE ID=1;
1つのレコード(1,'ciray')しか得られず、2つのレコードではなく、(1,'blog.csdn.net/ciray')でもありません.これは、IDがPRIMARY KEYであり、1番目のテーブルでレコードを照会した場合、後のテーブルにはチェックが記録されないためである.IDに一意性制約が定義されていない場合、このクエリは2つのレコードを取得します.
例:
drop table if exists t1;
drop table if exists t2;
drop table if exists t_merge;
CREATE TABLE `t1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
	name varchar(100),
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `t2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
	name varchar(100),
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE t_merge (
	ID INT NOT NULL auto_increment,
	name varchar(100),
	PRIMARY KEY (ID) 
) ENGINE = MRG_MYISAM INSERT_METHOD = FIRST
UNION
	= (t1, t2);
insert into t1 values(1,'aa');
insert into t2 values(1,'bb');

insert into t1 values(2,'cc');
-- insert into t_merge (id,name) values(2,'dd');   。t1       ,     3  
-- insert into t_merge (3,'dd');   
insert into t_merge (id,name) values(3,'dd');
select * from t_merge;
select * from  t1;
select * from t_merge where id = 1;

説明:
1:上に設定した挿入方式はFIRSTなので、t_mergeに挿入する場合はt 1に挿入し、NOに設定するとt_への挿入は許されないmergeにデータを挿入します.
2:t 1,t 2にデータを挿入し、t_mergeでは自動的に更新されます.