MySQLパーティションテーブルは月別に分類されています

MySQLパーティションテーブルは月別に分類されています

単一の MySQL テーブルのデータ量は 2,000 万行を超えないようにすることをお勧めします。そうしないと、パフォーマンスに大きな影響を与えます。最近、7,000 万行を超えるデータを含む単一のテーブルを持つプロジェクトを引き継ぎました。単純なクエリでも結果が出るまでに 50 分以上かかり、非常にイライラしました。最終的に、パーティション テーブルを使用することにしました。

テーブルを作成する

一般テーブル (innodb) が作成されると、idb ファイルは 1 つだけになります。

テーブル normal_table を作成します(id int 主キー、no int)

データベース ファイルを表示します。

通常のテーブル.ibd  

月ごとに分割されたパーティション テーブルを作成します。注意してください。通常の主キーに加えて、月フィールド (パーティション分割に使用されるフィールド) も主キーにする必要があります。

テーブルpartition_tableを作成します(id int AUTO_INCREMENT、create_date date、name varchar(10)、 
主キー(id, create_date)) ENGINE=INNODB DEFAULT CHARSET=utf8 
範囲(月(作成日))でパーティション分割(
パーティション四半期1の値が(4)より小さい場合、
パーティションの四半期2の値が(7)より小さい場合、
パーティション四半期3の値が(10)未満の場合、
パーティション四半期4の値が小さい(13)
);

データベース ファイルを表示します。

パーティションテーブル#p#四半期1.ibd  
パーティションテーブル#p#quarter2.ibd  
パーティションテーブル#p#quarter3.ibd  
パーティションテーブル#p#quarter4.ibd

入れる

パーティションテーブルに挿入します(create_date、name) values("2021-01-25", "tom1");
パーティションテーブル(create_date、name)に値("2021-02-25", "tom2")を挿入します。
パーティションテーブル(create_date、name)に値("2021-03-25", "tom3")を挿入します。
パーティションテーブルに挿入します(create_date、name) values("2021-04-25", "tom4");
パーティションテーブル(create_date、name)に値("2021-05-25", "tom5")を挿入します。
パーティションテーブル(create_date、name)に値("2021-06-25", "tom6")を挿入します。
パーティションテーブル(create_date、name)に値("2021-07-25", "tom7")を挿入します。
パーティションテーブル(create_date、name)に値("2021-08-25", "tom8")を挿入します。
パーティションテーブルに挿入します(create_date、name) values("2021-09-25", "tom9");
パーティションテーブル(create_date、name)に値("2021-10-25", "tom10")を挿入します。
パーティションテーブル(create_date、name)に値("2021-11-25", "tom11")を挿入します。
パーティションテーブル(create_date、name)に値("2021-12-25", "tom12")を挿入します。

クエリ

パーティションテーブルからcount(*)を選択します。
> 12

 
2 番目のパーティション (第 2 四半期) のデータを照会します。
パーティションテーブルPARTITION(quarter2)から*を選択します。

4 2021-04-25 トム4
5 2021-05-25 トム5
6 2021-06-25 トム6

消去

テーブルを削除すると、テーブルのすべてのパーティション ファイルも削除されます。

補足:Mysqlは月テーブルごとに自動的にパーティション分割します

コアとなる 2 つのストアド プロシージャ:

  • auto_create_partition はテーブルパーティションを作成するために使用されます。呼び出された後、翌月末までテーブルにテーブルパーティションが作成されます。
  • auto_del_partition は、履歴データ領域の回復を容易にするためにテーブル パーティションを削除するために使用されます。
区切り文字 $$
存在する場合はプロシージャを削除します auto_create_partition$$
CREATE PROCEDURE `auto_create_partition`(IN `table_name` varchar(64))
始める
   SET @next_month:=CONCAT(date_format(date_add(now(),interval 2 か月),'%Y%m'),'01');
   SET @SQL = CONCAT( 'ALTER TABLE `', テーブル名, '`',
     ' パーティションを追加 (パーティション p'、@next_month、" 値が (TO_DAYS( 未満 )、
       @next_month ,")) );" );
   @SQL から STMT を準備します。
   STMT を実行します。
   割り当てを解除し、STMT を準備します。
終了$$

存在する場合は削除プロシージャ auto_del_partition$$
CREATE PROCEDURE `auto_del_partition`(IN `table_name` varchar(64), IN `reserved_month` int)
始める
 v_finished INTEGER DEFAULT 0 を宣言します。
 v_part_name varchar(100) DEFAULT "" を宣言します。
 part_cursor CURSOR FORを宣言する 
  information_schema.partitions から、table_schema = schema() のパーティション名を選択します。
   および table_name=@table_name かつ、partition_description < TO_DAYS(CONCAT(date_format(date_sub(now(),interval reserved_month month),'%Y%m'),'01'));
 継続ハンドラを宣言する 
  見つかりません。v_finished = TRUE に設定してください。
 part_cursor を開きます。
read_loop: ループ
 part_cursor を v_part_name に FETCH します。
 v_finished = 1の場合
  read_loop を終了します。
 終了の場合;
 SET @SQL = CONCAT( 'ALTER TABLE `', table_name, '` DROP PARTITION ', v_part_name, ";" );
 @SQL から STMT を準備します。
 STMT を実行します。
 割り当てを解除し、STMT を準備します。
 ループを終了;
 part_cursor を閉じます。
終了$$

区切り文字 ;

ここに例があります

-- records というテーブルがあると仮定し、パーティション条件を month by end_time でパーティション分割するように設定します。DROP TABLE IF EXISTS `records`;
テーブル「レコード」を作成する(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `start_time` 日時 NOT NULL、
  `end_time` 日時 NOT NULL、
  `memo` varchar(128) 文字セット utf8mb4 NOT NULL,
  主キー (`id`,`end_time`)
) 
範囲によるパーティション (TO_DAYS(end_time))(
 パーティション p20200801 の値は (TO_DAYS('20200801')) より小さい
);

`records_auto_partition` が存在する場合はイベントを削除します。

-- 月に1回実行され、最大6か月分のデータを保存するイベントを作成します DELIMITER $$
イベント「records_auto_partition」を作成する
スケジュール通り 1ヶ月ごと 完了後保存
有効にする
する
始める
auto_create_partition('records') を呼び出します。
auto_del_partition('records',6) を呼び出します。
終わり$$
区切り文字 ;

いくつかの注意事項:

  • MySQL 5.1 以降では、テーブル パーティションのインデックス フィールドが主キーである必要があります。
  • ストアド プロシージャでは、DECLARE の後に BEGIN を続ける必要があります。そうしないと、理解できないエラーが報告されます。
  • カーソルDECLAREは定義文の後に記述する必要があります。そうでない場合はエラーが報告されます。
  • MySQLを自分でインストールした場合、イベント機能が有効になっていない可能性があり、イベント作成時にエラーメッセージが表示されます。my.cnfを修正し、[mysqld]の下にevent_scheduler=1を追加して再起動してください。

これで、MySQL パーティション テーブルで月別分類を実装する方法についての記事は終了です。MySQL パーティション テーブルを月別に詳しく知りたい場合は、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL パーティション テーブルのパーティション キーが主キーの一部である必要があるのはなぜですか?
  • MySQL パーティション テーブルに関するパフォーマンス バグ
  • MySQLパーティションテーブルの詳細な説明
  • Mysql パーティションテーブルの管理とメンテナンス
  • MySQL 最適化パーティションテーブル
  • MySQL パーティションテーブル管理コマンドの概要

<<:  LinuxシステムでのSystemC環境設定方法

>>:  HTML フォーム タグの使用方法を学ぶチュートリアル

推薦する

WindowsはVMwareを使用してLinux仮想マシンを作成し、CentOS7.2オペレーティングシステムをインストールします。

目次1. ウィザードに従って仮想マシンを作成します2. オペレーティングシステムをインストールします...

Zookeeper&Kafka クラスターを構築するための Docker の実装

最近Kafka勉強しています。クラスタの状態をテストする準備をしていたときに、仮想マシンを 3 つ開...

VMware のインストールと使用時の問題と解決策

仮想マシンは使用中であるか、接続できません次のようなエラーが報告された場合解決まずこのページにアクセ...

MySQLトランザクションを実行するための構文とプロセスの詳細な説明

概要: MySQL は、トランザクションをサポートするためにさまざまなストレージ エンジンを提供しま...

CentOS6.5 でファイル共有サービス Samba を構築するチュートリアル

Samba サービス:このコンテンツはサンバサービス学習者の参考用ですケースの説明:企業の管理者は、...

水平プログレスバーの最後にテキストを表示するための実装コードの CSS 記述

問題の説明仕事で以下の成果を達成したいと考えています。 解決div タグに相対配置を追加し、絶対配置...

カルーセル例の JavaScript 実装

この記事では、カルーセルの効果を実現するためのJavaScriptの具体的なコードを参考までに共有し...

イメージを再構築せずにDockerにポートを動的に追加する方法

操作中に Docker コンテナの公開ポートを変更または追加する必要がある場合がありますが、実行中の...

ウェブサイトのユーザビリティとコンバージョン率を向上させる 25 のツール

ウェブサイトの場合、ユーザビリティとは、ユーザーが必要な情報を効果的に見つけたり、タスクを完了したり...

ulとliの基本的な使用法の分析

ナビゲーション、少量のデータテーブル、中央揃え<!DOCTYPE html PUBLIC &q...

CentOS7 での PostgreSQL 11 の詳細なインストールと設定のチュートリアル

1. 公式ウェブサイトアドレス公式サイトではインストールの参考手順が紹介されています。公式サイトを見...

MySQL ストアド プロシージャで case ステートメントを使用する詳細な例

この記事では、例を使用して、MySQL ストアド プロシージャでの case ステートメントの使用方...

ウェブページでmp3またはフラッシュプレーヤーコードを再生する

コードをコピーコードは次のとおりです。 <オブジェクト id="player1&qu...

Mac での MySql の詳細なインストールと構成

1.ダウンロードしてインストールする公式ウェブサイトからコミュニティ エディションの dmg インス...

Redis イメージの Docker インストールと設定手順

目次序文環境インストールMySQLコンテナを作成して起動する落とし穴を避けるための注意MySQLコン...