単一の 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$$ 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 パーティション テーブルで月別分類を実装する方法についての記事は終了です。MySQL パーティション テーブルを月別に詳しく知りたい場合は、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
>>: HTML フォーム タグの使用方法を学ぶチュートリアル
この記事では主に、レイアウトに役立つ、HTML ページ内の一部のコンテンツを固定してスクロール時にス...
質問:最近、プロジェクトを展開すると文字化けしたデータが出てきました。確認したところ、プロジェクトは...
ステートフック例: 'react' から useState をインポートします。 関...
準備のメリットPrepare SQL が生成される理由。まず、MySQL サーバー上で SQL を実...
1. インストールパッケージMYSQLサービスダウンロードアドレス:MySQL公式サイトからダウンロ...
ドロップダウンボックス、テキストフィールド、ファイルフィールド 上半分はデモンストレーション効果、下...
目次1. ファイルとディレクトリの基本的な保存2. Inコマンドの紹介(1)lnコマンドの基本情報を...
実験環境: MYSQL 5.7.22バイナリログを有効にするログ形式 MIXED実験プロセス: 1....
概要Docker 自体の現在のデフォルト ネットワークについては、単一ホスト上の異なる Docker...
W3Cschoolではこのように説明しています<meta> 要素は、検索エンジン向けの説...
次のように: docker run -d -p 5000:23 -p 5001:22 --name ...
MySQL では、ソートには order by を、ページングには limit をよく使用します。最...
以下の HTML タグには、基本的に既存のタグがすべて含まれています。数分かけて 1 つずつ参照する...
目次背景複合インデックスを理解する左端一致原則フィールド順序の影響複合インデックスは単一のインデック...
1. 事例会社のトップ以外の従業員全員を年齢別にグループ化します。 t_emp で id が存在しな...