どのように非常に技術的な内容の問題であり千万大きなテーブルの最適化は、通常、私たちの直感的な考え方は、分割またはデータパーティションにジャンプします、と私は追加して整理して何かをしたかった、と私たちは、この点で何かをしたいです学んだ教訓は、我々はまた、提案を歓迎します。
_
Pexelsからの写真
今、自己批判を続けるには、最初の心から4を発射し、後にもチームのいくつかの経験に言及した、私は次のシラバスをコンパイル。
それは徹底的にこの問題を理解したい場合、我々は原点復帰にバインドされている、私は三つの部分にこの質問を置く:「千万」、「大きなテーブル」、「最適化」、また形式に対応する「データの量、」我々は、図中の識別しました「オブジェクト」と「ターゲット。」
私は徐々に一連の溶液を与えるために、説明し始めました。
データ量:千万
実際には、ちょうど千万デジタル感覚、私たちの印象は、データが大きいことです。
ビジネスの変化と変化するデータの時間、量として、私たちはさまざまなシナリオのために、我々は異なる方法で処理している必要がありますようにという、このインデックスを見て、ダイナミックな思考を取る必要がありますので、ここでは、概念を精緻化する必要があります戦略。
①データの量は、千万で億以上に達する可能性
一部のデータは通常、時間をかけてデータの成長が徐々に超える千万しきい値は非常に簡単なことで、増加した水のロギングビジネス、です。
②データの量がデータ量は10百万円であり、比較的安定しています
データの量は、一般に、いくつかの状態のデータに有利になるように偏った比較的安定し、例えば、10万人のユーザーである場合は、テーブル内のデータ・レコードの行に対応する情報のこれらのユーザーは、ビジネスの成長に合わせて、大きさの相対的順序は、比較的であり、持っています安定しました。
③データの量は10百万円であり、そのようなデータを持つべきではありません
または、テーブルのデータの一部が長期間保管されていることを、データの99%が下落。この状況は、主に私たちの受動的に発見され、通常、それは遅すぎたとき、たとえば、あなたが構成テーブル、データの数千万の量を見ました古くなったデータやゴミデータ。
データの量が全体的な理解では、我々はデータコンテンツの第2の部分につながる可能性の理解のより最近のレベルを、確認する必要があります。
オブジェクト:データシート
データ操作プロセスパイプよりも、データベースの複数の存在下で、これらのパイプは、処理すべきデータを流れているように、これらのデータの有用性と家は同じではありません。
データは、一般的に3つのサービスタイプに分けられます。
①水のデータ
データフローがマルチペン事業との間に相関がない、ステートレスで、時間をかけて各事業は、新しい文書を作成します。
このようなトランザクションフロー、有料水、限り文書は、以前のデータに依存しない、次のデータ、データベースに時系列フロー内のすべてのデータによって特徴づけられる新しいビジネスを、挿入するために行うことができますよう。
②ステータスデータ
データの状態は、事業間のステートフルな、マルチペンがステートフルなデータに依存するだけでなく、データの正確性を確保するために、そのような成功のために支払うために、再充電するとき、元のバランスを取得する必要があります。
③データ構成
データサイズのこのタイプは、小さな、単純な構造で、通常静的データ、低周波数の変化です。
最適化を行うために場合は、識字の割合を考慮したい場合は、この時点で、我々は以下より、小さなテーブルを読み書き(* 3 3のようなマトリックスに直面し、実際には、理解の全体的な文脈の読み取り、書き込みを持つことができます...)、それは3 * 3 * 4 = 24種が明らかに表示されていない徹底的なんだろうが、また、完全に不必要な、あなたは別のデータ保存特性や動作特性のためのさまざまなビジネス戦略を指定することができます。
この点で、私たちは、コアアイデアは私達の全体の定規のデザイン、そして我々は、動的に行うことを決めた難易度を最適化することで、この問題の危険性、特に内側に、キーをつかむための方法を取る、それを整理するために、いくつかの一般的な最適化のアイデアを置きます。
最適化プログラムのために、私は詳しく説明するビジネス指向の寸法を採用したいと思います。
目標:最適化
この段階では、我々はもう少しまとめ、プログラムを最適化するために言っている、それは比較的全体です。全体を5つの部分に分かれています。
実際には、我々は通常、サブライブラリーサブテーブルを参照し、他のプログラムは、あなたが豊かに展開する場合は、ほんの少しの一部です。
当然のことながら、私たちが見ているデータの量は、それはあなたが複数のテーブルを維持したい、レベルが比較的大きいDBAをサポートしなければならないということである、より良い管理方法、事業開発の拡大をサポートすることができながら、いくつかの山、私たちの前に配置された性能を、確保しながら。
私たちは、これらの5つの改善点について話されています。
-
設計仕様
-
ビジネス層の最適化
-
アーキテクチャ層の最適化
-
データベースの最適化
-
管理の最適化
設計仕様
ここでは、最初の仕様設計ではなく、他の背の高いのデザインを述べました。
ヘーゲルは言った:順序は自由の第一条件です。特に、シーンの労働作業の部門で重要な、あるいはお互いにあまりにも多くのチーム、多くの問題を含んでいます。
私は、以下の仕様のいくつかを言及したいと思い、基準として使用することができます仕様の開発部の一部でしかありません。
規範の性質は解決策ではありませんが、従うべき千万仕様のための潜在的な問題のいくつか、大きなテーブルを排除するための効果的な方法、私は次のように詳細の一部であるブラッシング、および基本設計の一部をカバーし、私たちの共通の問題を使用することができます。
例えば、単にフィールド・テーブル・デザインのvarchar(500)されている、それは実際には非常に不規則な実装である、我々はこれらの仕様について話を展開する必要があります。
構成時の仕様:
-
デフォルトで使用InnoDBストレージエンジンMySQLデータベース。
-
統一文字セットは、MySQLデータベースに関連するシステム、データベース、UTF8文字セットを使用して、テーブル、アプリケーションへのアクセス、表示を確認し、他の場所は、セットの文字セットは、セットUTF8文字セットを統一されていることができます。
注:UTF8の表現形式は、クラスデータの必要性UTF8MB4に格納されていない、MySQLの文字セットが配置された内部のかもしれません。8.0がデフォルトUTF8MB4に既に存在する、同社のビジネスの状況に応じて設定を統一したりカスタマイズすることができます。
-
より良好なOLTPトランザクションに適したRR(反復可能読み取り)、RC(読み取りコミット)に統一されたセットにMySQLデータベーストランザクション分離レベルのデフォルト値は、初期化を示唆しました。
-
データベース内のテーブルは、合理的な計画である2000W未満でMySQLデータベースのための単一の表は、提案された単一のテーブルがコントロールの数を記録するデータの量を制御しなければなりません。
-
MySQLデータベース、可能な最小数のテーブルの例として、データベースは、各データベースの下で、データテーブルの数は、(パーティションテーブルを含む)が500以下、一般的に、一般に50以上ではありません。
内蔵テーブル仕様:
-
InnoDBは、外部キー制約の使用を禁止、我々はプログラムレベルでのことを確認することができます。
-
単精度浮動小数点ストアは、代替DECIMALのFLOATとDOUBLEを使用する必要があります。
-
代わりにINTのINTの使用、(4)のような定義整数精細ディスプレイ幅なし、。
-
使用ENUM型に推奨しない、TINYINTを代わりに使用することができます。
-
あなたが使用する必要がある場合は、TEXT、BLOB型として使用しないでください、大きすぎるか、一般的に大規模なフィールドタイプを記述するために使用されていない他のフィールドにテーブルを分割することをお勧めします。また、店舗の写真や文書にデータベースを使用しないでください。
-
YEAR(4)に格納されている場合、YEAR(2)を使用していません。
-
投書欄は、NOT NULLとして定義されます。
-
SQL DBAは、監査ツールを提供することが推奨され、ビルド規範テーブルは、監査ツールによって検討する必要があります。
命名規則:
-
データベース、テーブル、すべて小文字で使用されるフィールド。
-
データベース名、テーブル名、フィールド名、インデックス名は小文字、および「_」分割されています。
-
データベース名、テーブル名、フィールド名には12文字以上を推奨しません。(データベース名、テーブル名、カラム名64文字までが、簡単に識別して、ボリュームを減らすために、標準化のために、統一がない以上12文字以内)
-
データベース名、テーブル名、フィールド名が名前を知って見ることを意図し、あなたはコメントを追加する必要はありません。
参考のために、要約次の表で簡単に示す命名規則のオブジェクトの場合:
[名前]ボックスの一覧
インデックスの仕様:
-
インデックスの命名提案:idx_col1_col2 [_colN]、uniq_col1_col2 [_colN](フィールドは長すぎる略語を推奨されている場合)。
-
インデックス内のフィールドの数が5の上にはお勧めしません。
-
インデックスの数は、単一のテーブル5内に制御します。
-
InnoDBテーブルは、一般的に、特に高可用性クラスタソリューションでは、主キー列を持っている推奨必須項目としてあります。
-
あなたは、複合インデックス、前面の高い選択優先順位フィールドを作成する場合。
-
UPDATE、DELETEステートメントは、WHERE条件に基づいてインデックスを追加する必要があります。
-
このようLIKE「%のweibo」などのあいまいクエリは、インデックスを使用することはできません%接頭辞を推奨しない、それは、全表スキャンにつながります。
-
以下のようなインデックスをカバーの使用の合理化、:uidが主キーでない場合はUSER_EMAILはuid = XX FROM uidをSELECT電子メールは、あなたは、クエリの効率を向上させるためにカバーするインデックスidx_uid_email(UID、電子メール)を作成することができます。
-
インデックスフィールドに関数を使用しないでください、それ以外の場合は、インデックスクエリの失敗につながります。
-
インデックスを変更する必要があるかどうかを確認するために、DBAに連絡してください。
アプリケーション仕様:
-
ボトルネック後半分散スキームになってくださいストアドプロシージャ、トリガ、およびその他のカスタム機能、ビジネスロジックとDBが簡単に一緒に結合し、使用しないでください。
-
UNION、UNION ALLを減らし、UNION ALLを使用することを検討していない重い、ソート操作と少ないため、好ましくUNION ALL使用重量の必要は、存在しない場合、相対速度は、速いUNIONよりもあります。
-
場合大特に制限N、以下限界M、N、M又は大きなテーブルの使用を検討してください。
-
声明は、ヌルで順序を増加できない場合は注文して、グループ:など、減らすかの並べ替えを避けます。
-
テーブルに記録されたCOUNT(*)の番号を使用して、代わりのCOUNT(PRIMARY_KEY)とCOUNT(1)。
InnoDBテーブルは、COUNT(*)操作を使用しないように、計数統計は、リアルタイム要件を使用することができるmemcacheのか、Redisのは、強力な、非リアルタイムの統計情報は定期的に更新だけでは統計を使用することができます。
-
フィールド変更操作を(列/変更列を変更)、元の音の特性がそうでなければ変更したときに追加される必要がありますか、コメントは失われます。
-
性能や回避SQLインジェクションを向上させることができプリペアドステートメントを使用します。
-
INは、SQL文の値はあまりすべきではないが含まれています。
-
UPDATE、DELETE文では明確なWHERE条件を持っている必要があります。
-
フィールドの値は、MySQLの暗黙の型変換を避けるために、フィールドのデータ型の条件を満たすために必要なWHERE。
-
SELECT、INSERTステートメントは、明示的にフィールド名を指定するか、またはSELECT * INSERT INTO table_nameの値の使用を禁止しなければなりません()。
-
バッチ提出(INSERT INTO table_name表のVALUES()、()、()......)を使用して、INSERT文は、値の数はあまりすべきではありません。
ビジネス層の最適化
ビジネス層の最適化は、最も高い降伏は道を最適化すべきではなく、完全に目に見えるビジネス層のために、そこにビジネスの分割は、データを分割し、され、最適化シナリオの2つの一般的な種類(読み、以下の書き込みが、あまり書き込みを読んで、それ以上)!
①事業の分割
以下の二つの側面に分けサービススプリッタ:
-
混合トラフィックが分割独立したサービスです
-
状態及び履歴データの分離
サービス・スプリッタは、実際の合計量は依然として大きいことが明確に独立した事業、例えばAサービス、サービス2 ......独立した事業サービスなる売却のハイブリッドであるが、各部分は比較的独立しています信頼性がまだ保証されています。
状態及び履歴データを分離するために、私は説明するための例を与えることができます。
例えば:私たちは、テーブルのアカウントを持って、バランスがユーザ100と仮定されます。
私たちは、データの変更は非常に200のバランスという、履歴情報を追跡することができ、およびアカウントステータスデータが更新された場合、100のバランスを高め、データの変更後に場所を取る必要があります。
このプロセスは、UPDATE文、INSERT文に対応してもよいです。これは、我々は2つの異なるデータソース、アカウントとaccount_histに変換することができます。
次のようにaccount_hist 2つのインサートに記録されます:
次のようにアカウントの声明では、アップデートです。
これは非常に、メンテナンスの複雑さを軽減サービス応答効率を向上させることができ、また、ホットとコールドの非常に基本的な分離です。
②データの分割
日によって分割:この使用は、特にスプリット日付ディメンションの光の中で、比較的一般的ですが、実際には、プログラムのレベルの変化は小さいですが、スケーラビリティの大きな利点。
-
このようtest_20191021として日付ディメンションによって解像度データ、。
-
データはtest_201910として、周方向の寸法の数ヶ月に応じて分割されます。
-
test_2019として四半期データ、分割の大きさによります。
分割方式を使用して:スキームを分割することも、それ以上であろう一般的な使用、ハッシュ、範囲の使用、等です。
MySQLでは、私はそれがあるため、縦割りをしている間、データの記憶容量で、パーティションテーブルをお勧めされていない使用していますが、最終的な分析では、データはMySQLの拡張に優れている、展開のレベルを達成することは現実的に困難です道。
③あまり最適化されたシーンを読み書き
キャッシュ、Redisの技術の使用は、読み取り要求が大幅にホットスポットデータクエリのMySQL圧レベルを下げることができ、キャッシュのレベルで再生します。
④以下の書き込みを読んで、より最適化されたシーン
あなたは3つの手順を使用することができ、より多くの最適化シナリオを書きあまり読みます:
-
非同期モードを提出し、非同期アプリケーション層は、最も簡単で、最小限の同期待ちを起こし、パフォーマンスを向上させるためです。
-
使用キューイング技術、書き込み要求キューの大多数は、バッチで書き込まれたデータによって拡張することができます。
-
書き込みの頻度を減らして、理解することがより困難、私は例を与えます:
データがあまりにも頻繁に更新された場合に、わずかに低いシーンのためのビジネスの優先順位の量に比べて、このような統合クラスとビジネスデータ、について、あなたは適切に削減すること(例えば、元の10分から毎分の調整など)のデータ更新の範囲を調整することができます更新の頻度。
例えば、以下に示すように、ステータスデータは、積分200は更新されます。
下に示すような、に変換することができます。
ビジネス・データは、1分更新100として、短時間であまりにも頻繁に更新した場合は、100から10000までのポイントは、それはバッチは、時間の周波数に応じて提出することができます。
たとえば、次の状態データが更新され、以下に示すように、積分は、100:
以下のように生成することなく、100回のトランザクション(200 SQL文)は、2 SQL文を操作することができます。
このような周波数の詳細を更新するなどのビジネス指標に関して説明することができ、特定のビジネスシナリオに応じ時に決定しました。
アーキテクチャ層の最適化
実際の建築層の最適化、我々はビジネス・シナリオに基づいて、アーキテクチャレベルにいくつかの新しいトリックを導入する必要があり、ハイテクの仕事のようなものを考えます。
①システム・レベルの拡張シーン
ミドルウェア技術の使用:あなたは、水平展開をルーティングデータを得ることができ、一般的なミドルウェアはそうでMyCAT、ShardingSphere、ProxySQLとしています。
別々の読み取りおよび書き込み技術を使用して:これは、読み出し要求のために拡張され、より一定の遅延を許容する場合には、状態テーブルに焦点を当てて、パターンの複数のコピーのような、ミドルウェアを使用して実現することができる拡張読み取り需要のレベルを達成するために使用することができますmyCAT、ProxySQL、MaxScaleの、MySQLのルータのように。
負荷分散技術を使用して:一般的には領事のLVS技術やされているように、ドメイン名などのサービスを技術ベース。
②両方のOLTP + OLAPのビジネスシナリオ
このようTiDBとしてNewSQL、優先HTAP互換性MySQLのプロトコル・スタック技術を、使用することができます。
③オフラインビジネスシナリオの統計情報
から選択するオプションのいくつかの種類があります。
-
使用のNoSQLシステムは、二つのタイプ、一つの適切なプロトコルの互換性MySQLデータウェアハウス・システム、共通のまたはにInfobright ColumnStoreがあり、ストレージの別のタイプは、HBaseの技術として、異種方向に属し、列に基づいています。
-
システム位置の数を使用して、 Greenplumは統計は、このような使用として、MPPベースのアーキテクチャ、例えばT + 1として統計。
データベースの最適化
データベースの最適化は、実際には、カードの多くを再生することができますが、比較的に言えば、スペースはそれほど大きくないが、我々はそれを言うために一つずつ来ます。
①トランザクションの最適化
ビジネスシーン選択モデルでは、トランザクションが強いに依存しているかどうか、トランザクションに基づきます。取引の次元削減戦略のために、我々はいくつかの小さな例を与えます。
寸法削減戦略1:ストアドプロシージャ呼び出しは、SQLに変換され、透明呼び出します
新規事業のために、ストアドプロシージャの使用は明らかに良いアイデアではなく、機能・性能に比べてMySQLのストアドプロシージャや他の商用データベースを検証する必要がありますし、現在の軽量のビジネスプロセスに、「あまりにもストアドプロシージャを扱います「重いです。
一部が展開され、分散アプリケーションアーキテクチャのように見えるが、ストアドプロシージャは、ロジックの多くをカプセル化するため、データベース層を呼び出すことで道は、ストアドプロシージャに基づいており、それはデバッグが困難であり、移植性が高くありません。
このようなビジネスロジックとパフォーマンスの圧力は、データベースレベルであり、データベース層は、それが簡単に真の分散を達成するために、ボトルネックが、また困難になることができます。
だから、改善のための明確な方向性があり、ストアドプロシージャを変換することで、それはSQLの呼び出しに変換する方法は、非常に単純なビジネスの処理効率を向上させることができますし、データベースインタフェース上の明確な十分に制御を呼び出します。
寸法削減戦略2:DDL操作は、DML操作に変換され、
一部の企業は、多くの場合、緊急の必要性を持って、常にフィールドを追加するテーブルを必要とし、DBAやビジネスの学生が疲れている作られた、フィールドの何百ものテーブルを想像し、基本的にNAME1あり、name2の...... name100、どのデザイン自体の種類は、パフォーマンスを考慮していない、問題となっています。
その理由は、仕事をしませんでした月が40個の特性に増加した後、このような20個の特性を装備したゲームとして、ビジネス要件の動的な変化は、すべての機器が40個の特性を持っているので、という、あまりにも可能性があるため、あります使用、およびこのよう冗長性がたくさんあります。
私たちは、設計仕様はまた、いくつかのように、設計の基本的な要素のいくつかは、これらの塩基は、あなたがこれらの機能の拡張を実現したい場合は、実際には、道の構成によって実現することができ、限られたフィールドを維持するために、これを追加する必要があります言及内にありますフィールドが動的にいくつかの設定情報を変換しました。
構成情報は、データエントリを変更し、補完、拡張しやすい、より動的であるDMLによって行うことができます。
外形寸法削減戦略3:効率的な運用への削除操作
唯一の一ヶ月維持するために、このようなデータテーブルとして、いくつかの定期的なデータを、クリーンアップするために定期的にいくつかのビジネスニーズは、その後、時間を超えてデータのフレームを一掃する必要があります。
順序が比較的大きい場合、削除操作のコストが高すぎると、テーブルの下で、我々はより効率的な方法への削除操作を変換するためのソリューションの2種類を持つことができます。
最初はデータがクリーンA比較的制御の効率的な方法であるように、そのようなテーブルに従って月、週テーブル、他の設計寸法のスケジュールとして周期律表の事業所です。
2番目のオプションは、データの99%を、クリーンアップするような大規模なテーブル2000万などの操作、のMySQLの名前変更モードを使用することで、我々はすぐに「移行を達成するために、状況に応じてフィルタリングすることができますメイクを維持するために必要なデータの1%転置。 "
②SQLの最適化
実際には、比較的シンプルなデザインを必要とし、多くのポイントを基準に準拠している場合、アウトみかんの問題に終止符を打つだろう、標準的な設計です。
この中でいくつかのポイントを追加します。
-
簡素化するためのSQL文シンプルなので、優れているため、簡素化SQLの最適化は、素晴らしいツールです。
-
可能な限り回避又は関連していることが、需要のニーズを成長させ、このドアを開けたら、複雑さがマルチテーブル、大きなテーブルを処理に関連した大きなテーブルが悪夢である関連する、パフォーマンスの最適化は、決して大きなテーブルはもちろんのこと、後戻りのMySQLに関連しているではありません排除しますすでに商用データベースに存在する弱点、ハッシュ結合がは富むまだ問題、ではなく、大きなキルの絶対マスターとして、発足しました。
-
弱い手オプティマイザ行われている抗接続、回避の半接続を避けるために可能な限りSQL、抗接続、セミジョインは何ですか?
実際には、より良い例えば、理解:存在する、ではない存在ではない、では、抗加入のは、半接続され、千万大きなテーブルでこの問題は、パフォーマンスの違いは、数桁です。
③索引チューニング
大きなテーブルの最適化すべきは、確実性の程度を必要とします。
-
まず、ここで反論を受けていない、最初の設計仕様で、主キー、存在しなければなりません。
-
第二に、SQLは、できるだけ簡単なように、クエリモデルそのインデックスまたは一意のインデックスに基づいて照会します。
-
最後に、可能な限りデータクエリの範囲を排除するために、走査範囲または千万例で大きなテーブルを最小限に抑えます。
管理の最適化
これは、すべての最も無視部分にソリューションの一部であるべき、と私は最後に置かれ、私の同僚にこの運用・保守も有料トリビュートでは、常にこの問題の多くは、通常のデューデリジェンス(スケープゴート)であるべきと思いました。
一般的には大きなテーブルまでのデータ千万クリーニングは、より多くの時間がかかり、一口に聞こえるかもしれホットとコールドデータ戦略の分離を改善する必要のデザインで、この提案では、私はあなたに一例をあげると、操作ドロップ大きなテーブルですDDL変換可逆操作。
足と同義であるデータベース操作で、提出されたデフォルトのアクションをドロップし、かつ可逆的ではない、MySQLの該当するレベルドロップ操作の回復は、バックアップを復元するために、私たちは、Aへのドロップ操作を考えることができない限り、ありません可逆DDL操作の一種。
MySQLのデフォルトIBD各テーブルには、対応するファイルがあり、実際には、以下のTESTDBのtestdb_archからファイルを移行することです名前の変更操作ドロップ操作に変換することができます。
下に示すように、testdb_archサービスが表示されていないため、それが確認された場合の動作がスムーズに、この削除機能を実現することができます名前の変更が一定時間後に清掃することができる権限からは、既存のビジネス・プロセス・クリーニングのためのデータは、表示されません。
加えて、2つの追加の提案、変更のための大きなテーブルがあり、それらを繰り返すことはしません、例えば、Pt-OSCの工具交換やメンテナンス期間を使用するなど、可能な限り、オンラインで変更ピークの時間を考慮してください。
要約すると、実際には、一つの文で:千万大きなテーブルを最適化するために、価格のためのコストの最適化へのビジネスシナリオに基づいており、間違いなく最適化の孤立1レベルではありません。
出典:ヒューペルジンアーキテクチャノート