テーブルとパーティションMySqlデータベースのパーティションと分割方法は何ですか?


1、なぜテーブルとパーティションを分けますか?
日常的な開発において、私たちは常に大きな時計の状況に遭遇します。いわゆる大きな時計とは、百万級または千万級の記録を記憶した時計のことです。このような表は大きすぎて、データベースを調べたり挿入したりする時に時間がかかりすぎて、性能が低下しています。共同調査の場合、性能がさらに悪くなります。テーブルとテーブルのパーティションの目的は、データベースの負担を減らし、データベースの効率を向上させることです。通常は、テーブルの添削と検索効率を向上させます。
2、テーブルとパーティションは何ですか?
2.1スコア表
分表は一つの大きな表を一定の規則に従って複数の独立した記憶空間を持つエンティティテーブルに分解するもので、サブテーブルと呼ぶことができます。各表は三つのファイル、MYDデータファイル、MYIインデックスファイル、framテーブル構造ファイルに対応しています。これらのサブテーブルは同じディスク上に分布してもいいし、異なるマシン上にもあります。アプリを読んで書いたら、事前に定義された規則に基づいて対応するサブテーブル名を得て操作します。
2.2パーティション
パーティションと分表は似ています。全部規則によって表を分解します。大きなテーブルをいくつかの独立したエンティティテーブルに分割し、パーティションはデータを複数の位置に分割して保存し、同じディスクでもいいし、異なるマシンでもいいです。パーティション後、表面はまだテーブルですが、データは複数の場所に分散されました。appを読んで書く時に操作するのはやはり大きい表の名前です。dbは自動的にパーティションのデータを整理します。
パーティションの主な目的は、特定のSQL動作において、データ読み書きの総量を減少させ、応答時間を短縮することである。
2.3 mysql分表とパーティションには何の連絡がありますか?
1)、すべてmysqlの性能を高めることができて、高合併の状態の下ですべて1つの良好な態度があります。
2)表とパーティションが矛盾していないので、お互いに協力できます。それらの大アクセス量に対して、表データが多いテーブルに対しては、分表とパーティションを結合する方式をとってもいいです。アクセス量は少ないですが、テーブルデータが多いテーブルは、パーティションの方式などを取ることができます。
3)分表技術は面倒くさいので、手動でサブテーブルを作る必要があります。mergeを採用するのはいいですが、サブテーブルと配置子テーブルの間のunion関係も作成します。
4)表のパーティションは分表に対して便利で、サブテーブルを作成する必要がありません。
3、分表のいくつかの方法
3.1 mysqlクラスタ
分表ではないですが、分表と同じような役割を果たしました。クラスタはデータベースの操作回数を分担して、複数のデータベースにタスクを分担することができます。クラスタは読み書き分離でき、読み書き圧力を低減する。データベースの性能を向上させます。
3.2カスタムルール分表
大きい時計は業務の規則によって複数のサブテーブルに分解されます。通常は次のような種類がありますが、自分でルールを定義することもできます。
Range(範囲)Cというモードは、データを異なる範囲に分割することを可能にする。例えば、一つのテーブルを年によっていくつかのパーティションに分割することができます。
Hash(ハッシュ)Cのこのモードは、表の1つまたは複数の列のHash Keyを通じて計算することを可能にし、最後にこのHashコードの異なる数値に対応するデータ領域を通してパーティションを行う。例えば、テーブルのメインキーをパーティションするテーブルを作成してもいいです。
キーCの上にHashモードの延長があります。ここのHash KeyはMySQLシステムから生まれました。
List(予め定義されたリスト)Cというモードは、システムが予め定義されたリストの値によってデータを分割することを可能にする。
Compsite(複合モード)C以上のモードの組み合わせで使用します。
分表ルールはパーティションルールと同じです。パーティションモジュールに詳しく紹介します。
ここではRangeで簡単にどのように表を分けるかを紹介します。
仮に表の構造には4つのフィールドがあります。自己増id、氏名、預金金額、預金日付
預金の日付を規則の分表として、それぞれいくつかの表を作成します。
2011年:account_2011
2012年:account_2012
……
2015年:account_2015
appは読み書きする時、日付によって対応するテーブル名を検索します。手動で判定する必要があります。

var getTableName = function() {
  var data = {
    name: 'tom',
    money: 2800.00,
    date: '201410013059'
  };
  var tablename = 'account_';
  var year = parseInt(data.date.substring(0, 4));
  if (year < 2012) {
    tablename += 2011; // account_2011
  } else if (year < 2013) {
    tablename += 2012; // account_2012
  } else if (year < 2014) {
    tablename += 2013; // account_2013
  } else if (year < 2015) {
    tablename += 2014; // account_2014
  } else {
    tablename += 2015; // account_2015
  }
  return tablename;
}
3.3 merge記憶エンジンを利用して分表を実現する
mergeは表を分けて、メインテーブルとサブテーブルに分けて、メインテーブルはシェルに似ています。論理的にサブテーブルをカプセル化しています。実際のデータはすべてサブテーブルに格納されています。
メインテーブルを通してデータを挿入して調べられます。分表規則がわかれば、直接にサブテーブルを操作することもできます。
子表2011年

CREATE TABLE `account_2011` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`money` float NOT NULL ,
`tradeDate` datetime NOT NULL
PRIMARY KEY (`id`)
)
ENGINE=MyISAM
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
AUTO_INCREMENT=2
CHECKSUM=0
ROW_FORMAT=DYNAMIC
DELAY_KEY_WRITE=0
;
子表2012年

CREATE TABLE `account_2012` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`money` float NOT NULL ,
`tradeDate` datetime NOT NULL
PRIMARY KEY (`id`)
)
ENGINE=MyISAM
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
AUTO_INCREMENT=2
CHECKSUM=0
ROW_FORMAT=DYNAMIC
DELAY_KEY_WRITE=0
;
すべての年

CREATE TABLE `account_all` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`money` float NOT NULL ,
`tradeDate` datetime NOT NULL
PRIMARY KEY (`id`)
)
ENGINE=MRG_MYISAM
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
UNION=(`account_2011`,`account_2012`)
INSERT_METHOD=LAST
ROW_FORMAT=DYNAMIC
;
メインテーブルを作る時にINSERT_があります。METHODは、挿入方法を指定し、値を取ることができます。0は挿入できません。FIRSTをUNIONの最初の表に挿入します。LASTはユニオンの最後の表に挿入します。
メインテーブルで検索する場合は、すべてのサブテーブルを合わせて検索するのに相当します。このように分表の優勢を体現することができなくて、やはりサブテーブルを調べることを提案します。
4、パーティションのいくつかの方法
4.1 Range

create table range( 
  id int(11), 
  money int(11) unsigned not null, 
  date datetime 
  )partition by range(year(date))( 
  partition p2007 values less than (2008), 
  partition p2008 values less than (2009), 
  partition p2009 values less than (2010) 
  partition p2010 values less than maxvalue 
);
4.2 List

create table list( 
  a int(11), 
  b int(11) 
  )(partition by list (b) 
  partition p0 values in (1,3,5,7,9), 
  partition p1 values in (2,4,6,8,0) 
 );
4.3 Hash

create table hash( 
  a int(11), 
  b datetime 
  )partition by hash (YEAR(b) 
  partitions 4;
4.4 key

create table t_key( 
  a int(11), 
  b datetime) 
  partition by key (b) 
  partitions 4;
4.5パーティション管理
4.5.1パーティションの追加

ALTER TABLE sale_data
ADD PARTITION (PARTITION p201010 VALUES LESS THAN (201011));
4.5.2パーティションを削除する
パーティションが削除された場合、そのパーティションのすべてのデータも同時に削除されます。

ALTER TABLE sale_data DROP PARTITION p201010;
4.5.3連結パーティション
下のSQLは、p 201-p 201009を3つのパーティションp 201 Q 1-p 201 Q 3に合併します。

ALTER TABLE sale_data
REORGANIZE PARTITION p201001,p201002,p201003,
p201004,p201005,p201006,
p201007,p201008,p201009 INTO
(
PARTITION p2010Q1 VALUES LESS THAN (201004),
PARTITION p2010Q2 VALUES LESS THAN (201007),
PARTITION p2010Q3 VALUES LESS THAN (201010)
);
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。