MySQLのデータベースについて、この知識は確かにまだあなたを指すのだろうか?

MySQLを言えば、これは私たちの仕事ですので、我々は、必然的に技術を使用する、に精通しているが、あなたは本当にまだそれを習得しましたか?毎日それを繰り返すか、CRUD中!だから、別れCRUDを行う方法!ここで右に。シンプルなコンセプトの物事は、私は言及しません。直接技術に関する。

三つのフォームデータベース

第1正規形1NF:

テーブル内のデータフィールドは、最小単位は分割されない必要があり、それは、各フィールドのアトミック性を保証することです。例えば:

 

MySQLのデータベースについて、この知識は確かにまだあなたを指すのだろうか?

 

 

それでは、どのようなデザインに正しいのですか?アドレスは省、自治体や地域、街路、ブランドの数に細分化することができる場合には、第1正規形に違反していました。

それは分割することができない原子性を満たすために望んでいるならば、我々はまだライン上にない分社与えたこれらのデータを分割することができますか?以下は、私が分割されたデータです。

 

MySQLのデータベースについて、この知識は確かにまだあなたを指すのだろうか?

 

 

第二のパラダイム2NF:単純に使用する場合、このテーブルに関連付けます。

要件を満たすに基づいて1NF:それは表の列で、私たちは、主キーの両方に依存しなければならない、といずれかが主キーとは関係を持たないことはできません。含意は、テーブルのデザインは一つだけではなく、他を記述することができるということです

 

MySQLのデータベースについて、この知識は確かにまだあなたを指すのだろうか?

 

 

独立したもに埋め込まれています。第二のパラダイムは無関係なデータテーブルを排除します。

それでは、どのようなデザインに正しいのですか?アドレスは省、自治体や地域、街路、ブランドの数に細分化することができる場合には、第1正規形に違反していました。

この表領域アドレスとユーザーの気分は何の関係もありません。正しいアプローチは、あなたの感情のテーブルを記述する別のシートを確立することです。

第3正規形3NF:

任意の非主要フィールドを満たすに基づいて2NFはつまり、2NFベースでの推移的な依存を排除​​、他の非プライマリフィールドに依存しない、我々はデザイン分野が冗長現象が現れることができないことはできません。

 

MySQLのデータベースについて、この知識は確かにまだあなたを指すのだろうか?

 

 

私たちは、のregion_idに依存している、それは第三のパラダイムを満たしていないいくつかのテーブルの省、市、区、ストリート、detailaddress、dooridから見ることができます。

私は、とき抗3NFそれまで、私たちは3NFを反転する、実用的な仕事で、あなたにもう少し共有しますか?実用的な仕事、それの例を与えます!クエリが広まっている場合たとえば、私たちがユーザーに順序を関連付ける必要があるかもしれません、私たちが見るユーザー名とその他の情報をユーザーに表示する必要があるために表示する必要はありませんが、そうでない場合は抗3つのパラダイム我々は、関連するユーザーテーブルを必要とするクエリそれは、パフォーマンスに影響を与えるので、私たちは単に順番に設計してユーザー名フィールドを置くことができます。これは、パフォーマンスを向上させることができます。実用的な作品で柔軟に使用。

データベース大きな制約

図1に示すように、主キー制約(主キー)

ユニークな、null以外の文字

2、唯一の制約(ユニーク)

一意性は、空にすることができ、唯一のシングルがあります

3、チェック制約(チェック)

(:その他年齢、性別、など)の列のデータ形式の制限の範囲

4、デフォルトの制約(デフォルト)

データのデフォルト値

5、外部キー(外部キー)

2つのテーブル間の関係を確立します

データベースのトランザクション

データベーストランザクションとは何ですか?

単一の論理作業単位、またはによって実行される一連の動作を指し、すべて正常に実行され、またはまったく実行されません。

4つの特性の総務

不可分性

すべての事項は、一連の操作に含まれていることを不可分手段は、いずれか、すべて正常に送信、またはすべてのロールバックに失敗します。これは、データベーストランザクションの最も本質的な特徴です。

一貫性

一貫性の前に最初と最後にトランザクションの後、データベースの整合性制約が破壊されていない、それはデータベーストランザクションがデータのビジネスロジックの整合性と一貫性を損なうことができないと言われて、混乱のポイントがあることを意味する、と簡単にデータの一貫性は混乱しました。ここでは、スタンドアローンに重点下のトランザクションの一貫性は、内政問題でなければなりません。

隔離

各トランザクションは、トランザクションおよびトランザクションの間に独自のリソースユニットは、目に見えない、互いに分離されており、トランザクションの結果は、他のトランザクションに見えることがあります。ここでは、リソースの分割及び分離した粒子として理解することができます。

持久性

永続トランザクション、システム障害を提出したら、事が失われることはありません更新することを確認してください。ディスクに永続ように、それは理解することができます。

トランザクションの4つの分離レベル

ローからハイレベルへの単離、それぞれ

非コミット読み取り(READ_UNCOMMITTED)

トランザクションがコミットされていないデータBを読み込むための取引です。Bロールバックトランザクションが発生した場合、トランザクションは、ダーティリードが発生し発行します。

READ COMMITTED(READ_COMMINTED)

1トランザクションは、トランザクションBのデータがダーティリードの問題を解決するために提出されている読み込み、しかし事項の範囲内で、同じクエリが返す二つの異なるデータを、これは非反復可能読み取りです。

反復可能読み取り(REPETABLE_READ)

トランザクションが上にあるときは、もはやデータを修正することから、他のトランザクションを許可しません。この無制限の読み出しデータは、非反復可能読み取り、平行ファントムリードが発生挿入動作時間を解決するために変更されていません。

Serializableを(SERIALIZABLE)

シリアライズ分離レベルで、実行のトランザクションの直列化順序。そして、トランザクションが並列で動作させることができない、それはファントム読み取りの問題を解決します。

MYSQLのInnoDBエンジンのデフォルトのトランザクション分離レベル(SERIALIZABLE)反復可能読み取り(REPEATABLE_READ)ORACLEエンジンのデフォルトのトランザクション分離レベルが直列であります

InnoDBのインデックス

InnoDBのプロパティ

  1. 完全なトランザクションのサポート
  2. 行レベルのロックの行ベースのストレージ
  3. マルチバージョン同時実行制御
  4. デッドロック検出原子
  5. アトミッククラッシュリカバリ

InnoDBのチャート

論理的な記憶構造のInnoDB

いくつかのドキュメントのページからなるInnoDB内で、全てのデータが表スペース、表スペースとセグメント(セグメント)に格納され、領域(範囲)、ページ(PAGE)、ライン(行)は、ブロック(ブロックなります= 64ページ)1つの程度

図のInnoDBストレージ構造。

Bツリー

定義:Bツリー以下の条件は、m次のBツリーと呼ぶことができます。

  1. 各ノードは、m個のサブツリーまで持つことができます。
  2. ルートは、少なくとも2つのサブツリー(サブツリーの存在)を有します。
  3. ルートノードに加えて、残りのノードは、各ブランチは少なくともM / 2サブツリーを有します。
  4. すべてのリーフノードは、同じ層にあります。
  5. Kサブツリーは、分岐ノードk-1キーコードがキーコードが昇順に配列され、存在する持っています。
  6. キーサブツリーはCEIL量(M / 2)を満たす必要が-1 <= N <= M-1。

B木

Bツリーの特性は、各ノードは、鍵を格納し、データを格納することです。

図のB +ツリー。

B +ツリー特性:1.すべてのリーフノードサイズと順次連結させ大キーワードに応じて全ての要素の情報が含まれ、これらの要素は、レコードへのポインタを含み、葉ノード自体。中間ノードの2.すべての要素は、子ノード、子要素ノード要素内の最大(または最小)に存在します。

B +ツリーの利点:単一のノードに格納された1以上の元素(これらは、キーに対応する値のみを含む含まれていないため)ので、IOクエリの数が少ないこと。2.すべてのクエリは、現在、ノードからリーフノードにクエリ性能安定性を見つけなければならないB +ツリーのリーフノードは、対応する情報の値のみを格納するので、Bツリーは、に対してより安定です。3.すべてのリーフノードは、SQLクエリの範囲でかつ簡単にクエリを並べ替え、注文した二重リンクリストを形成します。4. B / B +ツリーの共通の利点:各ノードは、それによっての数を減らす、木の高さを変えることなく挿入以上の子を有する再バランスディスクに必要永続性、および多くのを必要とすること、データベースのインデックスのために非常に適しクエリとアプリケーションが挿入されています。この情報は、ページを指しツリーのノードに格納され、ページが迅速に対応するディスク上に見つけることができます。

MySQLのロックの概要

ロックは、リソースの処理メカニズムを所持するだけでなく、複数のスレッドや並行プログラミングの下で​​データの一貫性を保証するだけではありません。ロック自体をロックし、解放するリソースを消費します。理解し、ロック機構の使用の合理化、大幅にデータベースのパフォーマンスを向上させることができます。俳優のロックは、ロックの使用条件では、トランザクションはトランザクション用です。単一の操作を開くと、コミット/ロールバックトランザクションを表示しません、各トランザクション操作が自動的にデフォルトを開きます。

共有ロック

データ共有ロックの取引は、あなたは、このデータに加えて、このロックの交差点の他の業務を許可することができます。しかし、データに加えて、排他ロックのこの交差点から他のトランザクションを防ぎます。

共有ロックの文:LOCKを共有MODE SELECT * FRPM TABLE_NAME。

排他ロック

トランザクションデータとの排他的ロックを防ぎ、他のトランザクションに加えて、この交差点とロックに関する任意のデータ。

プラス排他ロック声明:TABLE_NAME WHERE FOR UPDATE SELECT * FROM。

意図的ロック

共存行および表ロック、マルチ粒度ロック機構、InoDBを可能にするための両方が意図ロック表ロックされ、内部で使用される意図的ロックの二種類があります。

意図共有ロック

業務は、最初の共有意図ロックをテーブルを取得しなければならない前列共有ロックにデータ共有、データトランザクションの行をロックしようとします。

テント排他ロック

権利は、データライン排他ロックに追加していき、トランザクションは最初の排他ロックを追加する行のテーブルのデータ行の前に彼の意思のロックを取得する必要があります。

InnoDBは意図的ロックは自動的に行われ、ユーザーの介入を必要としません。

テーブル・レベル・ロック

各トランザクション動作は、テーブル全体、最大粒度、簡単、粗をロックします。利点は、ロックをロックされ、解放時間が大幅に削減されます。欠点は、ロック競合の確率が大きく、望ましくない高い並行性を増大することです。

ページレベルのロック

行レベルのロッキングとテーブル・レベルのロックとの間のリソースのオーバーヘッドは、デッドロックが存在するであろう。

行レベルのロック

各トランザクションが行だけがロックされた行に関与しているものと言うことです影響を受けた行を、、ロックし、デッドロックが発生します。利点は、ロックの競合、高い同時実行の小さな確率です。欠点は、小さなロックイオン度に、ロックをロック及び解放の数が大幅に大きいリソースのオーバーヘッドを増加させたことです。

MySQLの行レベルのロックがこの行ロックのみインデックス条件を介してデータを取得する手段を備え得るINNODB、インデックスエントリにインデックスすることによって達成される、InnoDBは、行レベルのロックが使用され、そうでなければ、InnoDBは表ロックを使用します。

ロックギャップ(ネクストキーロック)

、条件の範囲のためのキーが、レコードには存在しません。私たちは、データを取得するための条件ではなく、同じ条件の範囲を使用して、共有ロックまたは排他ロックを要求すると、InnoDBは、既存のインデックスデータ項目を遵守するには、条件をロックこの隙間がロックされるINNODB、ギャップと呼ばれる、ロック機構は、このいわゆるギャップロックではありません。ファントムリード分離レベルを防止する一方で、ギャップを用いINNODBロックオブジェクトは、例えば、関連する要件を満たすために、ロックギャップを使用しない場合、トランザクションレコードの任意の他の変更が挿入された場合、再度トランザクションコードが実行存在上記、ファントムリードが発生し、一方、必要性を満たすために、彼らの回復および複製をロックInnoDBのギャップを使用してリカバリおよび複製メカニズムについて、ならびにさまざまな分離レベルの下に影響を及ぼす。

明らかに、ときに、範囲の条件は、取得したレコードロックするために、Aのロック機構のブロックで、多くの場合、深刻なロック待ちの原因条件同時挿入、の範囲内のキー値を遵守するためのInnoDB。そのため、実際の開発では、特に同時挿入より多くのアプリケーションでは、我々はレンジ条件の使用を避け、アクセス、更新されたデータに等しい条件を使用しようと、ビジネス・ロジックを最適化してみてください。

デッドロック

デッドロックは、二つ以上のトランザクションが同じリソース上でお互いを占めるように参照し、他の占有リソースのロック要求、悪循環になります。トランザクションの試みは異なる順序でリソースをロックするときは、デッドロックを生成することができます。これは、複数のトランザクションが同時に同じリソースをロックすると、デッドロックがあります。

InnoDBの回避デッドロック

  1. デッドロックを回避するために、単一の書き込み操作に同時のInnoDBテーブルを複数実行するために、トランザクションは、SELECTを使用して、各レコード(行)のために開始することができます... UPDATEステートメントのために必要なロックを取得するように変更されることを意図している、でも、これらのステートメントを変更するだけで実行した後に沿ったものです。
  2. トランザクション内のレコードを更新する場合は、直接ロックの十分なレベル、すなわち排他ロックを適用する必要があり、共有ロックを適用し、更新ロックの排出のために適用するのではなく、ユーザーが排他ロックに適用されますので、この時、他のトランザクションかもしれません彼らはロックの競合、さらにはデッドロックが生じ、同じレコードに共有ロックを取得しています
  3. 複数のテーブルを変更したり、ロックするトランザクションが必要な場合は、ロックステートメントは、各トランザクションで同じ順序で使用する必要があります。異なるプログラムの並行は、複数のテーブルにアクセスする場合の使用では、同じテーブルにアクセスするために合意する必要があり、非常にデッドロックの可能性を低減することができます
  4. SELECT ... LOCKを共有MODEかけて現在のトランザクションがレコードを更新する必要がある場合は、読み取りロックラインを取得した後で、それはデッドロックが発生する可能性があります。
  5. トランザクション分離レベルを変更します

デッドロックが発生した場合は、生成された最新のデッドロックの原因を特定するためにSHOW INNODB STATUSコマンドを使用することができます。デッドロックのリターン結果に関連する事項を含む詳細については、。SQL文によって引き起こされるような、ロックトランザクション等、どのようなロック、取得したロールバックされ、トランザクションが保留されています。このデッドロックによると、原因と改善策を分析することができます。

オプティミスティック・ロック

ロックは、リソースを消費することで、我々はそこにロックすることとロックリソースのオーバーヘッドをリリースする予定、上記と述べました。ロックは、それは良いことではない、いくつかのリソースを取得できるようにする必要がないのですか?オプティミスティック・ロックは(光栄、リソースや紛争の小さな確率をつかむために、他の事項が存在しないので、少しいくつかの試みが成功することができます)リソースをロックされていないリソースをつかむためにして得ることができるようになりますように楽観的です。小さな確率のシナリオ適用競合。

ペシミスティック・ロック

紛争、悲観的な思考のグラブすべてのグラブのリソースまたは複数のリソースの大規模な確率で。ロックの単なるリソースを押収し、処理、リソースの最終リリースを行うことができます。

SQLの最適化

必要に応じて説明コマンドの最適化

説明このコマンドは、クエリのSQL実行計画の使用に使用されます。テーブルから提出された選択を説明します。

次のフィールドを確認することが重要になります。

+ ---- + ------------- + ------- + ------------ + ------- + - -------------- + -------------- + --------- + ------ + --- --- + ---------- + ----------------------- + | ID | selecttype | 表| パーティション| タイプ| possiblekeys | キー| KEYLEN | REF | 行| フィルタ| エクストラ| + ---- + ------------- + ------- + ------------ + ------- + - -------------- + -------------- + --------- + ------ + --- --- + ---------- + ----------------------- + | 1 | SIMPLE | T0 | NULL | レンジ| idxtradeid | idxtrade_id | 8 | NULL | 2 | 100.00 | インデックス条件を使用して| + ---- + ------------- + ------- + ------------ + ------- + - -------------- + -------------- + --------- + ------ + ---セット内--- + ---------- + ----------------------- + 1行(0.02秒)

重要なフィールド説明:

SELECT_TYPE:選択クエリのタイプは、このような単純な、主、労働組合、などのサブクエリとして、使用;

表:アクセス対象のテーブルの上に、マルチテーブル場合、プレスアクセス装置のようなものを持っています。

タイプ:テーブル内の行を見つけるためにmysqlの方法を示して非常に、非常に重要なメトリック、また、アクセスタイプとして知られています。良好な順に乏しいからパフォーマンスのアクセスタイプは、システム> CONST> eqref> REF>全文> refornull?Indexmerge> uniquesubquery> indexsubquery>範囲>インデックスである> ALLは、一般的に、少なくともレンジクエリレベルことを確認する必要があり、好ましくはそれ以外の場合は、パフォーマンスの問題が発生する可能性があり、refを達成。

possible_keys:それがnullである場合には、使用されるかもしれない、何の指標を使用しなくてもよい示します。

キー:それがnullである場合、インデックスを使用して、インデックスのない使用がないことを示します。

key_lenに:インデックスのバイト単位の長さ、値が小さいほど、速く発現し;

REF:別の列名の対応表。

行:返されたデータの行のクエリ数。

余分:関連して業務に関連する情報

索引チューニング

1.無効にノーバウンド問い合わせ!=、<、>、<=、> =それ以外の場合は、インデックスにヒットしません。

2.これは、境界クエリNOT INなしで禁止されて、それがインデックスにヒットしません

3.禁止が曖昧またはファジーフル問い合わせを残し、それがインデックスにヒットしません

4.フィルデータフィールドのデフォルト値はnullではない、それがインデックスにヒットしないと、デフォルト(既定の制約デフォルトCounstraint使用)を

5.フィールドを計算した後、インデックスにヒットしません。

最も左接頭原則6.インデックスの構成

数値フィールドの種類に関しては7が単一でない引用符は、インデックスがかかります

マルチテーブル結合フィールドの型が一致していなければならないON状態8.、それ以外の場合は、インデックスにヒットしません

より良いBIGINTより9.varcharクエリのパフォーマンス、BIGINT型のフィールドには、全表スキャンになり、varchar型の裁判官に各文字は、インデックスがかかりますので、全表スキャンを避けるため。

10.使用小数点小数のタイプを、そして二重フロートフロートとダブル・データ・ストレージの使用を禁止し、又は精度の損失は、次に結果、必須の使用小数点データ型不正確な決意をもたらすことができます。

使用is_の先頭にフィールドの概念は、データの型は、符号なしtinyint型を入力するかどうかの11発現は、1が偽のための0を表します。

12.任意の非負の数は、年齢などの符号なしの型として宣言する必要があります。そして、他の状態は、その最大容量値が2倍になります。

13.保存された文字列の長さがほぼ同じ場合は、そのようなチャー電話番号11として固定長の文字列型を使用しなければなりません。

14時には、性別フィールドインデックスを作成する必要はありません、状態、この小さなフィールドの異なる値は、インデックスを必要としません。

15テーブルに行数、5万行または2Gよりも単一のテーブル容量よりも、それがサブテーブルが推奨されます

16.更新を実行または削除には、まずデータの誤って削除発生を回避するために、選択する必要があります

データベース分割

データベースや高負荷からの要求データベアラ、我々は別の読み取りと書き込み、データキャッシュの使用を検討します。ビジネスの成長に合わせしかし、データベースへの圧力は、単一のデータベースの圧力を共有し、サブライブラリーのサブテーブル、分解を運ぶメートルを検討するために必要なしきい値に達しました。

垂直分割

垂直分割データベース:すべてのデータは、典型的には異なるサービスと異なる記憶テーブル(表)に従って確立し、垂直解像度が複数のデータベースにサービス・データベースに従って分割されます。各サービスに対応する元のテーブル、垂直分割した後、サービス(もちろん、ビジネス・データベースに対応する複数のピットが存在してもよい)に対応するデータベースです。そのコアは、特別な目的のために使用されます。結果は、元の圧力が個々の分割後のデータベースの同じ株に応じてサービス・データベース・システムである達します。垂直解像度は、より多くの方法をお勧め分割です。

垂直スライスのアーキテクチャと設計は、多くの場合、調整が必要です。プロセスの現在のマイクロサービスでは、垂直分割データベースは非常に友好的です。

垂直分割データテーブル:単一のテーブルデータ2ギガバイトまたは5,000,000行が分割データテーブル考慮しなければならない達する、テーブルを垂直に分割し、ホット列に頻繁に使用されるリストになり、オープン分割し、単一のテーブルのサイズを小さくではありません。

スプリット水平

ボトルネックは、一般的に縦割りである場合には、水平分割データテーブルはなります。別の場所でこのよう縦割りでは、彼はテーブル構造を変更することはありません。レベルのサブテーブルは、同じマルチテーブル構造を複数に分割するテーブルであり、これらのテーブルは、異なるデータベース内に配置されています。

サブライブラリーのサブテーブルミドルウェアプロキシモード1.二つのサブサブテーブルデータベースミドルウェアがあります。MyCatは; 2.サブライブラリーのサブテーブルのミドルウェアクライアントモード:ShardingJDBC 3.トランザクション分散データベース(もちろん、また、エージェントShardingProxyサブライブラリーのサブテーブルミドルウェア)

要約:マイクロサービスシステム、ほぼ垂直分割の組み合わせ。マイクロサービスデータベースが圧力を表示されたら、その後、水平に分割されます。

おすすめ

転載: www.cnblogs.com/WIU1905/p/11802862.html