この記事では、MySQL がテーブル パーティションを再構築してデータを保持する方法を紹介します。MySQL テーブル パーティション(パーティション) は、クエリを実行するときに、対応するパーティション内で検索することができます。なしのクエリ条件 クエリ効率を向上させるには、テーブル全体をクエリする必要があります。
パーティション分割されたテーブルとパーティションのないテーブルの使用に大きな違いはありませんが、テーブルを再分割したい場合は、パーティションを削除して再構築するとデータが削除されるため、直接操作することはできず、いくつかの特別な処理が必要です達成することが求められます。
1. 元のテーブルと同じ構造を持つ新しいテーブルと新しいパーティションを作成します。
2. 元のテーブルのデータを新しいテーブルにコピーします。
3. 元のテーブルを削除します。
4. 新しいテーブル名を元のテーブル名に変更します。
ログテーブルの元の構造は次のとおりで、ID ごとにパーティション化されています。
CREATE DATABASE `test`;use `test`;CREATE TABLE `log` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `content` text NOT NULL COMMENT '内容', `status` tinyint(3) unsigned NOT NULL COMMENT '记录状态', `addtime` int(11) unsigned NOT NULL COMMENT '添加时间', `lastmodify` int(11) unsigned NOT NULL COMMENT '最后修改时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 /*!50100 PARTITION BY RANGE (id) (PARTITION p10w VALUES LESS THAN (100000) ENGINE = InnoDB, PARTITION p20w VALUES LESS THAN (200000) ENGINE = InnoDB, PARTITION p50w VALUES LESS THAN (500000) ENGINE = InnoDB, PARTITION p100w VALUES LESS THAN (1000000) ENGINE = InnoDB, PARTITION pmax VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */;insert into `log`(content,status,addtime,lastmodify) values('content1',1, unix_timestamp('2018-01-11 00:00:00'), unix_timestamp('2018-01-11 00:00:00')), ('content2',1, unix_timestamp('2018-02-22 00:00:00'), unix_timestamp('2018-02-22 00:00:00')), ('content3',1, unix_timestamp('2018-03-31 00:00:00'), unix_timestamp('2018-03-31 00:00:00'));
データパーティション分布の表示
SELECT PARTITION_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA='test' AND TABLE_NAME = 'log';+----------------+------------+| PARTITION_NAME | TABLE_ROWS | +----------------+------------+| p10w | 3 | | p20w | 0 | | p50w | 0 | | p100w | 0 || pmax | 0 | +----------------+------------+
ログデータは時間で検索する必要があるため、ログ時間でパーティションを再構築する必要があります。
1は、時間ごとにログを作成します. log2テーブルの名前をlog
CREATE TABLE `log2` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `content` text NOT NULL COMMENT '内容', `status` tinyint(3) unsigned NOT NULL COMMENT '记录状态', `addtime` int(11) unsigned NOT NULL COMMENT '添加时间', `lastmodify` int(11) unsigned NOT NULL COMMENT '最后修改时间', PRIMARY KEY (`id`,`addtime`), KEY `id`(`id`), KEY `addtime`(`addtime`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 /*!50100 PARTITION BY RANGE (addtime) (PARTITION p201801 VALUES LESS THAN (unix_timestamp('2018-02-01 00:00:00')) ENGINE = InnoDB, PARTITION p201802 VALUES LESS THAN (unix_timestamp('2018-03-01 00:00:00')) ENGINE = InnoDB, PARTITION p201803 VALUES LESS THAN (unix_timestamp('2018-04-01 00:00:00')) ENGINE = InnoDB, PARTITION p201804 VALUES LESS THAN (unix_timestamp('2018-05-01 00:00:00')) ENGINE = InnoDB, PARTITION pmax VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */;
に変更します
実行後にデータパーティションの分布を確認してくださいinsert into `log2` select * from `log`;
logテーブルのデータが新しいパーティションに格納されていることがわかります。
この記事では、テーブル パーティションを再構築し、データを保持するための MySQL の関連方法について説明します。関連知識の詳細については、PHP 中国語 Web サイトを参照してください。
関連する推奨事項:
オブジェクトのプライベート属性をサポートしないphp json_encodeに関する説明
以上がテーブルパーティションを再構築してデータを保持するためのmysql関連の方法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。