[電源を入れる]データベースの最適化の仕上げ

再現:https://blog.csdn.net/u013628152/article/details/82184809

A:最適化の仕様

:データは、ユーザーが8秒の最大待機時間を耐えることができたことを示しています。そこに多くのデータベースの最適化戦略、初期設計は、ある重要である後半のパフォーマンス最適化のための良好なデータ構造を構築します。データベースが最適化戦略のさまざまな方法を使って、システム構造の基礎、基本的なプレーもあるので、我々は完璧な結果を達成することはできません。

B:データベースの最適化の側面を見ることができ、データ構造、SQL、インデックスが最小のコストと最適化の結果の最良の手段です。
ここで説明する絵を書きます

C:パフォーマンスの最適化は、パフォーマンスが需要を満たすためにするとき、無限であるが、過剰に最適化しません。

II:最適化の方向

1. SQLの最適化とインデックス

まず、ニーズに応じて適切に構造化SQLを記述し、その後、SQLに基づいてテーブル内の有効な指標を確立します。しかし、あまりにも多くのインデックスは書き込みのみの効率に影響するだけでなく、クエリに影響を与えない場合。

2.合理的なデータベース設計

これは、三のパラダイムのデータベーステーブル構造に基づいて設計されています。テーブル構造を設計するとき、我々はより効率的なクエリを設計する方法を検討する必要があります。

3つのデータベースパラダイム:
最初のパラダイム:各フィールドのデータテーブルの最小単位を分割してはならない、すなわち、各列のアトミック性を保証するため、
第二のパラダイム:パラダイム満たさ、テーブルの各列は、固有の性質を有していなければなりません;、主キーに依存しなければならない
パラダイムは、間接的に関連する(外部キーを直接に関連している)のではなく2つだけ直接マスターキーに関連付けられたテーブルの各列、無電界冗長満たす:第三のパラダイム。

注:そこには最高のデザイン、唯一の最も適切な設計がされていないので、理論を強調しすぎることはありません。三つのパラダイムが根本的な根拠はなく、丸暗記として使用することができます。

時にはシーンに基づいて、正規化を解除するのが妥当である:
A:パーティションテーブル。
B:予約済み冗長フィールド。クエリ内の2つの以上のテーブルが頻繁に接続する必要がある場合、それは冗長な複数のフィールドは、テーブル間のあまりに頻繁な接続を回避するために、データが冗長列は、典型的には、まれにケースを変更し、前記テーブルに増加させることができます使用下。
C:派生列を増やします。他のカラムに由来するテーブル内の列の計算複数であり、列はデータ収集が大幅に計算時間を短縮することができる場合、派生統計的操作を増加させるために減少させることができます。

データベース5つの制約:
A:PRIMARY KEY:主キー制約を設定する;
B:UNIQUE:ユニーク制約を設定し、値を複製することはできません;
C:DEFAULTデフォルトの制約
D:NOT NULL:NOT NULL制約、このフィールドは空にすることはできません。
E :外部キー:外部キー制約。

:フィールドタイプを選択して
使用TINYINT、SMALLINT、MEDIUM_INT整数型を作ることとINTとして、非負は、UNSIGNED追加しない場合:Aが
Bを:長さVARCHARは本当に唯一のスペースに割り当てる必要
Cは:代わりに整数文字列または列挙型使用の
Dを:代わりにDATETIMEのTIMESTAMPを使用するようにしてください
E:それは20の中に推奨され、あまりにも多くの単一のテーブルのフィールドをお持ちでない
F:NULLフィールドを使用しないよう、クエリの最適化は困難であり、追加スペースのインデックスを占めます

3.システム構成の最適化

たとえば、次のようにMySQLデータベースのmy.cnf

4.ハードウェアの最適化

より高速なIO、より多くのメモリ。データベース操作のためのより良い、メモリ一般的に大きいです。彼はあまりにも多くのCPUの数を使用していなかったので、しかし、マルチCPUは、お問い合わせの多くは、単一のCPUですがあるない場合があります。加えて高いIO(SSD、RAID)を使用するが、IOデータベースロック機構を低下させません。クエリがあるため、いくつかの内部データベースのロック原因で遅いのであれば、それはハードウェアを最適化しても意味がありません。

III:最適化

コードの最適化

それは最も可能性の高い技術者によって引き起こされているので、コードは、最初の場所にある理由は見落とさ。多くの技術スタッフは、後でパフォーマンスの最適化を得るようにキャッシュ、非同期、JVMとを接着する必要があります。実際には、最初のステップは、関連するコードの解析も適切なボトルネックを見つけ、再び特定の最適化戦略を検討すべきです。いくつかのパフォーマンスの問題は、裁判官の不必要な条件の多くを作った、同じロジックがそのように何回も繰り返され、あまりにも、このようなサイクルの数に関しては、コードは完全に不合理書かれているので、コードを直接変更することによって問題を解決することができます、があります。

栗の場合:
更新操作、最初のエンティティをチェックアウトし、データベースとの相互作用よりも、そう間違いなくより多くの更新を行いません。もう一つの問題は、更新ステートメントは、操作のいくつかのフィールドを更新する必要がないかもしれません。私たちは、属性ができ、特定のフィールドを更新するために、直接pdateByPrimaryKeySelectiveを通じて、実体にフォームを指し、updateTime、updateUserおよびその他の割り当て。

​​

遅いSQLの位置決め、および最適化

これは、最も一般的に使用される、それぞれの技術者が(メソッド、ツール、補助システム、などを含む)の基本的なSQLのチューニング方法を習得する必要があります。ここでのMySQLへの、例えば、最も一般的な方法は、スロークエリログにより位置決めされ、その後、説明、SQLの特定の問題に遅いクエリまたはオープンソースシステムを来るステップバイチューニングステップにプロファイルおよびその他のツール、そして最終的に達成するためにテストライン上の効果の後に。

SqlServerの実施計画:

実施計画では、我々はどのような情報を得ることができます:
Aは:のコストが比較的高いコストどのような手順
B:マルチステップによって生成されたデータのどのような量を、線の太さの量で表されるデータの量、それは直感的である
C:アクションの実装の何すべてのステップ

具体的な最適化手法:

:使用を最小限に抑える(またはしない)のSQLServer機能が来る
ストリング(名前、1,3)= 'ABC'からT WHERE IDを選択
T DATEDIFF(日、CREATEDATE、 '2005-11-30')からSELECT ID = 0
:このようなクエリであってもよい
'ABCの%'のような名前がTからSELECT ID
ID WHERE TからCREATEDATE> = '2005-11-30'とCREATEDATE < '2005年12月1日'を選択します

B:連続数値状態で、なしBETWEENと:T FROM ID SELECT BETWEEN WHERE NUM 1. 5と
C:UPDATE文、唯一の1回のフィールドの変更であれば、必ずしもすべてのUpdateフィールド、そう頻繁に呼び出されるが、大幅なパフォーマンスのオーバーヘッドが発生
Dを:文字のために設計するだけでなくよう場合数値フィールド、情報を含む数値フィールドを利用する
E:選択の使用はお勧めしません*トンから、代わりに「*」の分野の特定のリストで、より少ないとフィールドのいずれかを返しません。大量のデータを避けるために、クライアントに返さ、データが大きすぎる場合、それは需要に対応する考慮すべき合理的である
F:テーブルとテーブルの間で直接、より良いパフォーマンス、JOINよりも、冗長フィールドによって関連付けられている
Gを:選択してテーブルから(*)カウント;ので、すべての条件が全表スキャンが発生せずにカウント
チューニング接続プールを
制限し、他のデータベース接続のために、データベース接続への効率的なアクセスを実現するために、我々のアプリケーションを、多くの場合、接続プール・クラスを使用しますプログラム、すなわち、各プールに接続された管理データベースの各アプリケーションノード。以下のためのビジネストラフィックやデータ成長し、元の接続プールパラメータは、現在使用接続プール内の原則を組み合わせる必要で、今回の需要を満たしていない可能性があり、接続プール固有の監視データと現在の交通量に総合判定、繰り返し数回のデバッグを通じて、最終的なチューニングパラメータを取得します。

​​

インデックスの使用の合理化

通常の状況下で、効率的なインデックスです。しかし、戦略指数が時間のためのスペースで、指数自体は、クエリの効率を改善すると同時に、挿入に影響を与え、更新、削除、効率だろうに、頻繁に書き込みを表に索引を付けるべきではありません。

適切なインデックス列を選択し、場所を選択し、GROUP BYによるご注文、上の列の句索引項目として表示され、インデックスを作成するための小さなカラムの分散のための必要はありません。
主キーがインデックス化されているので、primayキー主キーは、もはや独自の一意のインデックスを設定する必要がありません

インデックス型
の主キーのインデックス(PRIMARY KEY)
一意のインデックス(UNIQUE)
の一般インデックス(INDEX)
の組み合わせ指数(INDEX)
フルテキストインデックス(FULLTEXT)

インデックスを適用することができ、オペレータは、
に等しい以上である

、IN
%を開始しません。LIKE

インデックス演算子は適用できません
NOT IN
LIKE初め_%を

インデックスフィールドを選択する方法
のフィールドがクエリに表示され、クエリがインデックスを使用することができます:Aを
B:一般的にインデックスとデジタルインデックスと高い文字列より検索効率の検索
C:高い実行頻度ステートメント、一日を千倍以上の
レコードの小さなセットをスクリーニングすることによって、フィールド条件:D

無効なインデックス
A:句がnull値を決定どこのフィールドにないようにしてください、インデックスと全表スキャンの使用放棄するエンジンの原因となります
それ以外の場合は、where句では避けるべきである:! Bを=または<>演算子エンジンは、インデックスと全表スキャンを使用して放棄します。
C:フィールドインデックスがある場合句は、フィールドがインデックス化されていない場合は、エンジンがインデックスを使用してあきらめさせるとフルテーブルスキャンしますで回避または条件を結合するために使用されるべき
NUM = 10トンから選択IDをか名前= ' 管理者は、「
このクエリは、次のことができます
から、T = 10 SELECT ID NUM
連合
名=からID SELECT T」管理者"
連合のすべてが繰り返されたか否か、すべてのデータを返します。組合は自動的に重複データを削除し、圧縮します。

D:カラム計算はない
年齢+ 1 = 10は、カラムのいずれかの動作はデータベース機能のチュートリアルを含むスキャンテーブル、及び他の計算式になりますここで
E:それは「%のAAA」である場合、クエリのように、インデックスに使用されていません

ポイントテーブル

サブテーブル方式
スプリットホライズン(行)、垂直分割(列)

サブテーブルのシーン
A:経験によると、MySQLのテーブルのデータは、一般的に百万レベルに達すると、クエリの効率が非常に低くなります。
B:一部のフィールド値と大きなテーブルにはほとんど使用されません。これらのフィールドは、このようなテストの点数などの主要外でリンク別のテーブル、に分離することができ、私たちはしばしば、テストが細部を気にしない、スコアに焦点を当てます。

水平成分ポリシーテーブル
タイムテーブルの並び順:データは月単位で分け、そのようなマイクロブログデータの強力な効果を持っている場合。
プレスセクション部品表:表で、例えば1から1000000 userテーブル、テーブルと二百万から百万。
サブテーブルをハッシュ表は、特定のハッシュアルゴリズムに従って元のターゲットIDまたは名前を格納するデータによって算出されます。

別々の読み取りと書き込み

サーバは、需要、別々の読み取りの使用を満たすために、書き込みができない場合は、[書き込み:更新/追加/削除]方法クラスタ。
接続の最大数をサポートするためのデータベースが限られており、多くのユーザーの同時アクセスは、サーバは要求を満たすことができない場合は、クラスタを処理することができます。最も一般的に使用されるMySQLのクラスタリング手法は、読み取りと書き込みの別のものです。

マスター・スレーブ同期:データベースは、最終的にディスクにデータを永続化し、クラスタは、各データベース・サーバーのデータが同じであることを確認する必要があります。メインライブラリからライブラリーからのデータを同期させるために、書くために、ライブラリからの主なライブラリをお読みください。
別々の読み取りと書き込み:サーバー読み込みから読み取るために、書き込みにメインライブラリに書き込み操作を、負荷分散を実現するために使用します。

キャッシュ

カテゴリーキャッシュ
ローカルキャッシュ:HashMapの/のConcurrentHashMap、Ehcacheの、グァバキャッシュなどの
キャッシングサービス:Redisの/ TAIR / Memcacheの、など

シーンに使用し
、同じデータが何度も繰り返され、データが頻繁に更新されていない短い時間のクエリを、クエリをキャッシュ起動を選択することができ、この時間は、クエリがロードされ、その後、キャッシュウェイに戻って、データベースから設定することはできません。このようなシナリオは、単一のキャッシュに適しています。
高い同時クエリホットデータは、バックエンド・データベースが圧倒、あなたが運ぶためにキャッシュを使用することができます。

キャッシュアクション
のアクセス時間を短縮、データベースへの圧力を軽減します。

キャッシュを選択して
データ量が少なく、頻繁に成長し、空に(頻繁にガベージコレクションにつながる可能性がある)しない場合は、ローカルキャッシュを選択することができます。あなたには、いくつかのサポートポリシー(キャッシュなどが立ち退きポリシーの完全である)必要がある場合は具体的に、そして、あなたはEhcacheの考えることができ、そのようConcurentHashMapを考慮することができるマルチスレッドのシナリオを検討する必要があるとして、必要でない場合は、HashMapを考慮することができます。
他の例では、キャッシングサービスを検討してください。現在はどうか、動的拡張の資源の投資、運用・保守や設備、私たちの優先順位TAIRを支援検討します。現在TAIRは(そのような分散ロック、値のハッシュタイプなど)の状況をサポートしていない場合を除き、当社は使用Redisのを検討してください。

キャッシュは、浸透
彼らは、バックエンドシステム(比見つけるために行く必要があり、対応する値が存在しない場合、それは、キャッシュクエリにキーに応じた、一般的なキャッシュシステムを
このようなDBなど)を。キーは、キーが存在しない場合に対応した一定値であり、複雑な大量のを要求した場合、バックエンドシステムが作られる
大きな圧力に。これは、キャッシングの浸透と呼ばれています。

クエリ結果はまた、空のキャッシュ、短い点のキャッシュ時間、または挿入後に、キーに対応するキャッシュデータをクリアする場合です。

同時並行性キャッシュ
キャッシュ障害が同時にDBクエリを複数のプロセスを発生し、キャッシュのケースを設定することができれば時々 、サイトへの高い同時アクセスならば、
確かに非常に大きなによって複雑ならば、それはまた、DB上の過度の圧力をもたらすことができる、とキャッシュは頻繁に更新します質問。

クエリキャッシュロック、KEYは、ロックを存在し、その後、キャッシュにDBを確認し、その後、ロックを解除しない場合は、ロック上の他のプロセスがある場合
、待機は、その後、ロック解除の復帰を待つか、データDBクエリを入力してください。

キャッシュアバランシェ(故障)
キャッシュサーバの再起動、または1つの期間に集中キャッシュ多数の失敗(例えば、DBなど)バックエンドシステム意志の故障は、そのように
多くの圧力をもたらしました。
異なるキーとしても、可能な限りキャッシュミスの時点に異なる有効期限の時間を設定します。

十分ではありませんキャッシュスペースを防ぐため
、キャッシングサービスへの①は、最も一般的なLRUなどの適切なキャッシュ立ち退きアルゴリズムを選択します。
②キャッシュデータ8Gに達したときにアラームが問題や拡張をトラブルシューティングするために前進し始めたときに、現在の設定のための能力は、そのような10Gのキャッシュとして、適切な警報値を設定します。
③キーのいくつかの長期保存を与える必要はありませんが、有効期限を設定してみてください。

我々は、データベースに格納されたデータは、永続的な特性を、読者があろうがあることを知っているので、我々は、図は、一般にキャッシュメモリ媒体である選択された層ウェブサーバー(DAO層)とDBとの間に層のキャッシュを追加参照しますディスクIO操作、ディスクの読み取りと速度がメモリよりもはるかに高速で書き込みがあります。(記憶媒体の選択は、アクセス速度を向上させるために:メモリ>>ディスクを、ディスクIO操作を減らし、スループット向上のために、お問い合わせの重複を減らします)

ここで説明する絵を書きます

​​

人気のあるオープンソースのキャッシュツール:ehcacheを、memcacheの、Redisの。

ehcacheを、プロセスの純粋なJavaのキャッシュフレームワークであり、そのL2キャッシュを利用して休止状態。一方、ehcacheをマルチキャストクラスターの方法によって達成することができます。これは、主にローカルキャッシュ、データベース・キャッシング・トップを使用します。
メモリキャッシュは、分散キャッシュシステムであって、マルチコアCPU、ない永続機能を活用することができ、単純なデータは、キー値を格納されている提供します。ウェブクラスタを行うことで、共有セッション、ページオブジェクトキャッシュとして使用することができます。
Redisのキー値の高性能システムでは、データ・タイプが豊富な、シングルコアCPU抗並行性、永続性を提供し、複製の主な機能を有しています。私は主に異なるビジネスに従って複数のグループに分けRedisのセンチネルのRedisを使用します。

Redisの注
:時間が経過するとキーセットを増加しようとし、またはRedisのサーバーのメモリ使用量は、使用RedisのVMシステムの性能低下をもたらす、最大物理メモリに達する;
B:Redisの主要な設計は、できるだけ短くすべきである、値複雑なオブジェクトを使用しない;
Cは:Redisのに(既存のJSONライブラリーの使用)後のJSONオブジェクトにオブジェクトを変換し;
Dは:グーグルいるProtobuf(Googleのオープンソースバイナリプロトコルオブジェクトにオブジェクトを変換し、JSONデータ形式が類似しているが、それがあるためバイナリパフォーマンス、JSONよりも性能効率およびフットプリントが小さく、欠点がいるProtobuf学習曲線)はJSONよりもはるかに大きいです;
E:あなたが接続を解放しなければならないのRedisを使用して終了した後。

関連するリード・データ・キャッシュは、データキャッシュがある場合は、データと呼ばれる直接のリターンは、「ヒット」ヒットがあり、
その後、キャッシュはキャッシュに関連するデータを読み出すために、データベースから関連データを持っていない場合、およびリターン。これは、データ・ミス「ミス」と呼ばれています

キャッシュのヒット率=キャッシュアクセス要求のキャッシュヒット要求/合計数の数= /(ヒット+ミス)ヒット

NoSQLの

キャッシュ差
まず説明し、キャッシュ等、Redisのが、ここで提示さと同じではないにも(例えばRedisの又はTAIRのような)データ記憶方式のために使用することができるが、NOSQLは、DBとして使用することです。DBを使用するようならば、効果的なストレージソリューションの必要性は、データの可用性と信頼性を確保します。

使用シナリオでは、
このサービスが記憶された使用のNoSQLに適したデータに関連する場合のNoSQLに適したデータの動作モードがやり方で動作するかどうか、確認するために、特定のビジネスシナリオの組み合わせを必要とする追加の特徴は、NoSQLの(このような原子を使用する必要がある場合加減算など)。
ビジネスは団体のためのデータやその他のデータを必要としない場合、トランザクションは、(などのHBaseなど)の使用のNoSQLのためのより適切なこの時間を必要とするか、外部キーなどをサポートし、非常に頻繁に書き込むことができません。
MySQLのは、MySQLの選択は簡単、瞬時の筆圧が急上昇した原因となる場合は、アプリケーションシステムに重大な障害がこの時点では、短期的な例外データを大量に生産する可能性がある場合ときたとえば、米国のグループは、内部監視システムが実行する1組の例外を持っているレビューMySQLサーバとマスタ-スレーブ同期遅延などの性能の急激な低下につながる、このシナリオでは、ストアするために使用HBaseの類似のNoSQLに適しています。
ビュー/ストアドプロシージャ
共通のビジネスロジック、ストアドプロシージャ、スケジュールされたタスクを使用するか、チームのリソースに応じて保存処理中に使用することができます統計関数を報告しないようにしてください。

GVMチューニング

システムを監視することにより、負荷値とCPUのGC数、各世代のメモリサイズの変更、マシンのGC時間(いくつかのマシンキー指標に(何も既製のシステムが存在しない場合は、簡単な報告システムの監視も非常に簡単です所有)このような出力とJSTAT GCログコマンドが表示されることがあり、アラームスレッドを監視)番号のJVMとしての利用には、主要なパフォーマンスデータラインインタフェースと要求サービスのJVMプロセスの経験の一部と組み合わせて、あなたは、実質的に現在の位置を特定することができますJVMの問題、およびチューニングの必要性がある場合。

非同期/マルチスレッド

一部のクライアントの要求が、サーバはこれらの子会社の要求のためにいくつかのことを行う必要があり、実際には、ユーザーがこれらの事を気にしない、またはユーザーがすぐにこれらのものの処理結果を取得する必要はありません、これは、使用非同期に適していますこれらの事に対処する方法。

非同期アクション
A:短い応答時間・インターフェース、ユーザーが迅速要求、より優れたユーザーエクスペリエンスを戻すことができます。
B:長いスレッドが実行され、それによって作業に多くの要求をブロックする、使用可能なスレッドのスレッドプールは、これにより、スレッドプールのタスクキューの長さを増加させる原因となる、十分な長さの原因となります避け、そのような要求は、より多くの技術的なプロセスではありません。
C:長いスレッドが実行されている、システムにも問題ロード、CPU使用率、全体的なマシンのパフォーマンスの低下を引き起こし、さらには雪崩につながる可能性があります。マシンの数とCPUの数、この問題に対する有効な解決策を増加させることなく、非同期のアイデアすることができます。

非同期
:あなたはIOスレッドで応答を返すようになるように対処するために、対応するタスクよりも、IOスレッド(処理要求応答)で採用慣行を使用して、余分なスレッドまたはスレッドプールを開くことができ、余分なスレッドオープンスレッド、。
B:ミドルウェアサービスのメッセージキュー(MQ)

サーチエンジン

たとえば、次のようにSolrの、elasticsearch

 

再現:https://blog.csdn.net/u013628152/article/details/82184809

おすすめ

転載: www.cnblogs.com/day1day1up/p/11299780.html