実用的なバックグラウンドの
プロジェクトといくつかの表スペースが大きすぎる、とあまりにも多くの行が、それは、テーブルにサブライブラリーサブテーブルの数を決定しました。また、研究の選択プログラム、我々はビジネスより多くのコードの変更のためのいくつかの一般的なサブライブラリーサブテーブル・ソリューションに気づいた、それはMySQLのパーティショニングスキームを採用することを決定しました。
実際には、私の個人的意見では、パーティションテーブルは、MySQLが根底にあるサブライブラリーサブテーブルを達成するために私たちを助けている、ビジネス・コードの修正を含む必要はなく、分散トランザクションを心配する必要はありません。データベース、ロジック、または唯一のテーブルへのアクセスの面で、実際には、複数の物理パーティションのオブジェクトを持っていないので、具体的なゾーニング規則に基づいて特定のパーティションを照会します。
練習テーブル、テーブルスペース172G、1〜120万レコードを紹介します。
データベースのバージョン:RDS MySQLの5.6
ツール:アリ雲DTS
まず、なぜパーティション?
長所:
有効期限が切れ、あるいは全く保存されたデータのために、あなたはすぐにこれらのパーティションに関連するデータを削除することで、データを削除することができ、高いDELETEよりも効率的である
パーティションがwhere句で一つだけをスキャンするのに必要な条件を含む場合や、クエリ効率を向上させるために複数のパーティション
、例えば、次のステートメント:
SELECT *パーティションT FROM(P0、P1)C <5は、パーティションP0およびP1がされた基準と一致するレコードだけを選択する。
集約関数SUM(に向け)を、COUNT()のクエリは、各パーティション上で並列に処理される際に
、パーティション元々のデータテーブルは、より高いIOPSを達成するために、複数の物理ディスクに保存されている
短所を:
外部キーを使用することはできません、また、フルテキストインデックス(現在なし会社をすべきではサポートされていません。外部キーで、右)
パーティション・キーのデザインは、パーティションキーを取らない場合、テーブル全体のロックを起こしやすい、柔軟ではない
SQLを記述するために、開発者は、MySQLは再生する方法は明らかではありません
二、RANGEパーティショニングは
、現在MySQLのレンジ・パーティション(RANGE)、リスト・パーティション(LIST)、ハッシュ・パーティショニング(HASH)とKEYパーティション4をサポートしています。
この記事は、レンジ・パーティション(RANGE)時間のパーティションに基づいているので、私は簡単にRANGEパーティションを説明します。MySQLの5.6公式文書のより多くのパーティションタイプパーティションタイプを参照してください。
パーティションを割り当てられた間隔に従って、指定された列の値の継続間隔に。最も一般的には時間フィールドに基づいています。あなたは整数に変換された日付タイプの機能を使用できるかどうか実際には、整数列のパーティションに基づいて、それがベストです。MySQLの5.6サポートされているパーティション関数
この例で使用は、機能TO_DAYS
CREATE TABLEのメンバー(
ID VARCHAR(25)NOT NULL、
姓VARCHAR(25)NOT NULL、
姓VARCHAR(25)NOT NULL、
ユーザ名VARCHAR(16)NOT NULL、
電子メールでVARCHARを(35)、
joindate DATETIME NOT NULL DEFAULT '0000-00-00 〇時00分00秒'、
PRIMARY KEY(ID、joindate)を用いBTREE、
KEY idx_joindate(joindate)を用いBTREE
)ENGINE = InnoDBのDEFAULT CHARSET = UTF8 ROW_FORMAT COMPACT =
RANGE BY PARTITION(TO_DAYS(joindate) )(
P0パーティション以外VALUES LESS(TO_DAYS( '1960年1月1日'))、
パーティションP1 VALUES未満(TO_DAYS( '1970-01-01'))、
パーティションP2 VALUES未満(TO_DAYS(「1980年1月1日「))、
VALUES LESS THAN(TO_DAYSは(パーティションP3」1990-01-01「))、
VALUES LESS MAXVALUE P4 THANパーティション
);
PSは:あなたは主キーまたは一意のインデックスを持っている場合は、例のように、あなたのパーティションを配置する必要がありますまたjoindate分割キーでキーを追加、または作成に失敗します!
PS:上記のようにプラスLESS THAN MAXVALUE、後で新しいパーティションを追加することはできません!!!
例:
次のクエリは定義されたインデックス・パーティションP2に分類されます。そのため、クエリのキーは、複数のパーティション間で、あなたの条件の集計関数SUM()、COUNT()は、クエリ、それは各パーティション上で並列に処理される場合は、データのクエリをパーティションに対応するパーティションをダウンさせるだろうとき。あなたは完全な表パーティションを取らなかった場合は、キーのクエリは、クエリを実行します。
説明パーティションはjoindateのメンバーから選択* 「1970年2月3日」AND「1970年2月4日BETWEEN」;
分割キーの時間間隔は、SQLと同じではない場合、私は、データのクエリの移行が完了した時点で、特に興味深い現象を発見し、行の行数に基づいて、インデックスの異なる範囲を行くために少なくなります。それは根本的に達成する方法であるように私は勉強に行きませんでした
第三に、パーティション管理を
その後、簡単なパーティションの範囲への導入、および一般的な操作のパーティションについて何かを言います。
パーティションマネージャは、パーティションの増加、削除、およびクエリが含まれています。より詳細なパーティション管理MySQLの公式ドキュメント
1.増加パーティション
RANGEとLISTパーティションに:
ALTER表の追加パーティションTABLE_NAME(パーティションP0の値を...(EXP))
... //著作権2011すべての権利移動の著者
//使用ソースコードは、これはBSDスタイルによってAのIS支配
//ライセンスは、その中LICENSEファイルで見つけることができます。
//パッケージのエラーはエラーを操作するための機能を実装しています。
パッケージエラー
//新しいは、指定されたテキストなどの形式エラーを返します。
FUNC新(テキスト文字列)エラー{
リターン&errorStringに{テキスト}
}
// errorStringには、エラーの些細な実装です。
型errorStringに構造体{
Sストリング
}
FUNC(E * errorStringに)エラー(){文字列
戻りES
}
上記のコードは、複雑ではない、上記を参照して、我々は、カスタムエラー処理を書き込みます。
カスタムエラー処理は、
処理のアラームのため、alarm.goを定義します。
騒ぎ、コードで直接見て。
パッケージ警報
インポート(www.chaoyuepint.com
"符号化/ JSON"
"FMT"
"ginDemo /共通/機能"
"パス/ファイルパス"
"ランタイム"
"文字列"
)
型errorStringに構造体{
Sストリング
}
errorInfo構造体{入力し
、 "時間" `:時間の文字列` JSON
アラーム文字列`JSON: "アラーム"`
メッセージ文字列`JSON: "メッセージ"`
ファイル名の文字列`JSON:www.zbzxyL12.com "ファイル名"`
ラインがint `JSONを: www.yisheng3yuL.com "ライン" `
FUNCNAME文字列` JSON:www.seocelve.com "funcnameに" `
}
FUNC(及びerrorStringに*)エラー(www.chenghylpt.com){文字列
戻りES
}
FUNC新(テキスト文字列)エラー{
アラーム( "INFO"、テキスト)
リターン&errorStringに{テキスト}
}
//发邮件
FUNCメール(テキスト文字列)エラー{
アラーム( "EMAIL"、テキスト)
リターン&errorStringに{テキスト}
}
//发短信
FUNC SMSの(文字列)エラー{
アラーム( "SMS"、テキスト)
リターン&errorStringに{テキスト}
}
//发微信
FUNC微信(文字列)www.renheyL.comエラー{
アラーム( "WX"、テキスト)
リターン&errorStringに{テキスト}
}
//警報方法
FUNCアラーム(レベル文字列は、文字列STR){
//現在時刻
CURRENTTIME:= function.GetTimeStr()
//定義ファイル名、行番号、メソッド名の
ファイル名、行、functionNameを=、 "?"?0、 ""
PC、ファイル名、行、OK www.feironggw.cn:= runtime.Caller(2)
OKであれば{
functionNameを= runtime.FuncForPC(PC).NAME()
functionNameを= filepath.Ext(functionNameをwww.ztylegw.cn)
functionNameを= strings.TrimPrefix(functionNameを、 "")
}
VaRのMSG =のerrorInfo {
時間:CURRENTTIME、
アラーム:レベル、
メッセージ:STR、
ファイル名:ファイル名、
行:行、
FUNCNAME:functionNameを、
}
jsons、ERRS:= json.Marshal(MSG)
!= nilのERRS場合{
fmt.Println( "JSONマーシャルエラー:"、ERRS)
}
errorJsonInfo:=文字列(jsons)
fmt.Println(errorJsonInfo)
レベル== IF「EMAIL」{
//電子メールの実装
他に==レベル}「SMS」{IF
//は、テキストメッセージを実行します
他に==レベル}「WX」{IF
//マイクロチャネルを実行します
レベル他== IF}「INFO」{
//日記の実装
}
}
を呼び出す方法を見て:
パッケージV1
インポート(
"FMT"
"ginDemo /共通/アラーム"
"ginDemo /エンティティ"
"github.com/gin-gonic/gin"
"ネット/ HTTP"
)
AddProduct FUNC(C * gin.Context){
//パラメータゲット
名:= c.Query( "名前" )
VAR RES = entity.Result {}
STR、ERR:=こんにちは(www.hengxyul.com名)
ERR = nilの{IF!
res.SetCode(entity.CODE_ERROR)
res.SetMessage(err.Error())
c.JSON(http.StatusOK、RES)
C. ABORT(www.chengmingdl.com)
を返す
ALTER TABLEメンバーは、パーティション(TO_DAYS(「2021年3月1日を」))ADD;
2.パーティションが削除
パーティションを削除し、また、パーティション内のすべてのデータが削除されます。あなたはすべての値をカバーすることはできませんパーティションにパーティションのリードを削除した場合は、ときにデータエラーを挿入します。
;パーティションP0テーブルtable_nameはALTERドロップ
どのように多くのパーティション3 Discoverを
TABLE_NAME =「INFORMATION_SCHEMA.PARTITIONS SELECT * FROMメンバー」;
四は、データの移行は
非常に多くの概念の前で言った、私はパーティションにデータを移行するには、この大きなテーブルについて話しますプロセステーブル。
DTSは、なぜあなたはそれを選んだのですか?それは移行と段階的な移行の全額を支援するために、データのノンストップ移行することができますので、それは元のテーブルにほとんど影響を与えません。
次のように移行プロセスは次のとおりです。
まず、パーティションテーブル構造の内部で構築されたRDSの同じインスタンスで
DTSを使用して移行タスクを作成するには、構造銭を移行する際に、選択しただけ全額+増分移行を選択しないでください
その後、移行マッピングA-下で行われる次のターゲットデータベースのテーブル名を、編集する必要があります> Bからの
タスクキューが空の場合、書き込みデータのタスクをオフにする、一時停止する数分待ってから移行タスクの終了は、
最後のテーブル名を変更し、データ移行およびスイッチング(いくつかの時間のためのパーティションテーブルを変更するために、私のテスト環境を、しかしRDSテーブル名を秒単位で変更された変更)は
、公式ドキュメントを参照してください:MySQLの5.6パーティション
ビューの純粋に個人的な点より、私を修正してくださいされていない場合。