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 フォーム タグの使用方法を学ぶチュートリアル

推薦する

高度な JavaScript フロントエンド開発でよく使用されるいくつかの API の例の詳細な説明

目次ミューテーションオブザーバーAPI特徴インターセクションオブザーバーAPI例えば画像の遅延読み込...

モバイル端末におけるビューポートの具体的な使用法についての簡単な説明

目次1. 基本概念1.1 2種類のピクセル1.2 3つのビューポート2. ビューポート設定3. 1回...

Windows Server 2008 R2 リモート デスクトップのポート 3389 を変更する方法

Windows サーバー リモート デスクトップのデフォルトのポート番号は 3389 です。職場でサ...

Vue ファースト スクリーン パフォーマンス最適化コンポーネントの知識ポイントの概要

Vue ファースト スクリーン パフォーマンス最適化コンポーネントVue ファースト スクリーン パ...

写真とテキストによる MySQL と sqlyog のインストール チュートリアル

1. MySQL 1.1 MySQLのインストールmysql-5.5.27-winx64 ダウンロー...

MySQL 8.0.21 の最新バージョンのダウンロード、インストール、設定に関する詳細なチュートリアル

1. ダウンロード1. インストールパッケージをダウンロードするMySQL ダウンロード パス: h...

MySQL 5.7.24 圧縮パッケージのインストールと設定方法のグラフィックチュートリアル

この記事では、参考までにMySQL 5.7.24圧縮パッケージのインストールチュートリアルを紹介しま...

Mysql systemctl start mysqld によって報告されるエラーの解決策

エラーメッセージ:制御プロセスがエラー コードで終了したため、mysqld.service のジョブ...

MySQL 増分バックアップとブレークポイントリカバリスクリプトの例

導入増分バックアップとは、完全バックアップまたは最後の増分バックアップの後、後続の各バックアップでは...

Docker を使用して開発環境を構築する方法 (Windows および Mac)

目次1. Dockerを使用する利点2. Dockerをインストールする1) LinuxにDocke...

JSX を使用してカルーセル コンポーネントを実装する方法 (フロントエンドのコンポーネント化)

JSX を使用してコンポーネント システムを構築する前に、例を使用してコンポーネントの実装原理とロ...

JS ベースの Ajax 同時リクエスト制御を実装する方法

目次序文Ajax シリアルおよびパラレルAjaxの同時リクエスト制御のための2つのソリューションPr...

MySQL 整合性制約の定義と例のチュートリアル

目次整合性制約整合性制約の定義整合性制約の分類主キー制約単一の主キーと複合主キーの違い主キーフィール...

Nest.js 認証検証方法の例

目次0x0 はじめに0x1 RBAC 実装0x2 クレームベースの承認0x3 統合 CASL 0x4...

Mysql SSHトンネル接続を使用するための基本的な手順

序文セキュリティ上の理由から、MySQL の root ユーザーはローカルにのみログインでき、外部ネ...