ホームページ > バックエンド開発 > PHPチュートリアル > mysqlでテーブルパーティションを再構築してデータを保持する方法を紹介

mysqlでテーブルパーティションを再構築してデータを保持する方法を紹介

jacklove
リリース: 2023-04-01 12:04:02
オリジナル
2841 人が閲覧しました

この記事では、mysql でテーブル パーティションを再構築し、データを保持する方法を紹介します。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 を作成し、時間ごとにパーティション化します (月ごとに 1 つのパーティション)

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) */;
ログイン後にコピー


2. ログ データを log2

insert into `log2` select * from `log`;
ログイン後にコピー


3. ログ テーブルを削除します

drop table `log`;
ログイン後にコピー


4. log2 テーブルの名前を log

に変更します。
rename table `log2` to `log`;
ログイン後にコピー


実行後にデータ パーティションの分布を確認する

SELECT PARTITION_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA='test' AND TABLE_NAME = 'log';+----------------+------------+| PARTITION_NAME | TABLE_ROWS |
+----------------+------------+| p201801        |          1 |
| p201802        |          1 |
| p201803        |          1 |
| p201804        |          0 || pmax           |          0 |
+----------------+------------+
ログイン後にコピー

ログ テーブルのデータが新しいパーティションに格納されていることがわかります。

この記事では、MySQL でテーブル パーティションを再構築し、データを保持する方法を紹介します。詳細については、PHP 中国語 Web サイトを参照してください。

関連する推奨事項:

php json_encode はオブジェクトのプライベート属性のソリューションをサポートしていません

PHP による一意の属性の生成に関連RequestID クラス 内容

#js の基本データ型と変換演算子

以上がmysqlでテーブルパーティションを再構築してデータを保持する方法を紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート