みなさん、こんにちは、私はアヒルだ:
mysqlのパーティションに関するあなたと共有し、今日。
要件:
タイム・パーティション。データテーブルの数百万人の左右の数十、パーティションは、万人の約10 /年のデータ量を増加させます。
コードの実装:
シミュレーションテーブルが既に存在する前に:
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`description` varchar(512) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
`state` tinyint(4) NULL DEFAULT 0 COMMENT '0:未处理,1:处理中,2:处理完成,3:异常订单',
`create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间'
) ;
#増分をキャンセル
alter table test modify id int;
#ドロッププライマリ
alter table test drop PRIMARY KEY;
#複合主キーを追加します。
alter table test add PRIMARY KEY(id,create_time);
変更の増分を#ID
alter table test modify id int AUTO_INCREMENT;
#ユニークなインデックスを作成することができませんので、複合インデックスを増やし、パーティションフィールドは、一意である必要があります。
#ALTER TABLE test ADD UNIQUE (serial_no,delete_flag);
#追加パーティション、プレス1年
ALTER TABLE test PARTITION BY RANGE COLUMNS(create_time ) (
PARTITION p1 VALUES LESS THAN ( '20190101'),
PARTITION p2 VALUES LESS THAN ( '20200101'),
PARTITION p3 VALUES LESS THAN ( '20210101'),
PARTITION p4 VALUES LESS THAN ( '20220101'),
PARTITION p5 VALUES LESS THAN ( '20230101'),
PARTITION p6 VALUES LESS THAN ( '20240101'),
PARTITION p7 VALUES LESS THAN ( '20250101'),
PARTITION p8 VALUES LESS THAN ( '20260101'),
PARTITION p9 VALUES LESS THAN ( '20270101')
);
簡単な紹介:
MySQLのパーティションタイプ
RANGE分割は:
指定された連続値の範囲に属する列に基づいて、複数のラインは、パーティションに割り当てられます。
LISTパーティション:
同様のプレス範囲パーティション、そのリストのパーティション以外は、列の値に基づく値が離散値のセットが選択されると一致しています。
HASHパーティショニング:
選択すべきユーザ定義パーティションの戻り値の式に基づいて、これらの行のテーブルに挿入されるカラムを使用して、この式の値が計算されます。この関数は、任意の非負の整数値のMySQLの有効な表現に含まれてもよいです。
KEY区:
それだけで1つ以上の列を計算サポートパーティション・キー、およびMySQLサーバを除いて同様によるHASHパーティションは、独自のハッシュ関数を提供します。1つ以上の列が整数値を含み、存在する必要があります。
コンポジットパーティション:
各パーティションRANGE / LIST型のパーティションテーブルに基づいて再分割します。子パーティションはHASH / KEY他の種類のことができます。
頻繁に使用するコマンド:
あなたはパーティションテーブルを作成します。#:
CREATE TABLE `test` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`description` varchar(512) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
`state` tinyint(4) NULL DEFAULT 0 COMMENT '0:未处理,1:处理中,2:处理完成,3:异常订单',
`create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `etc_cg_document_i4`(`state`) USING BTREE,
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Compact PARTITION BY RANGE (`id`)
PARTITIONS 2
(PARTITION `p1` VALUES LESS THAN (10000) ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 ,
PARTITION `p2` VALUES LESS THAN (20000) ENGINE = InnoDB MAX_ROWS = 0 MIN_ROWS = 0 )
;
パーティションIDに#:(増加パーティション)
alter table test partition by range(id)
(
partition p1 values less than (10000),
partition p2 values less than (20000)
);
#指定されたパーティションを削除します。
alter table test drop partition p1;
#すべてのパーティションを削除します。
Alter table test remove partitioning;
#表示パーティション情報
SELECT
PARTITION_NAME,
TABLE_ROWS
FROM
INFORMATION_SCHEMA.PARTITIONS
WHERE
TABLE_NAME = 'test';
別の下にあればと言っ削除されたパーティションは、指定したパーティションのデータは削除、運動の注意を同期します。
必要に応じてパーティションテーブルを再構築し、データ保つMySQLの例を、このを参照してください。
https://blog.csdn.net/fdipzone/article/details/79769524
最適化MySQLのに大量のデータがこれを見て:
https://blog.csdn.net/afsvsv/article/details/84998119
詳細はMySQLのパーティション情報、こちらの記事を参照してください。