その後、MySQLは、ソートアウト簡単に基本的な次の概念、および拡張やクエリのこれら二つのフェーズのサブ最適化を作成します。
基本的な概念の1はじめに
1.1論理アーキテクチャ
-
第1層:クライアント接続サービス、実行によって送信されるSQL命令による
-
第二層:サーバーの解析と最適化SQLは、最終的な実装計画を生成し、実行します
-
第三層:ストレージエンジンは、データの保存と検索のために責任があります
1.2ロック
共有ロック(ロックを読んで)と排他ロック(書き込みロック) - データベースはロック機構により、同時実行シナリオを解決します。ブロックされていないロックを読んで、複数のクライアントが同時に同じリソースから読み取ることができます。書き込みロックは排他的であり、他の読み取りおよび書き込みロックをブロックします。単純に楽観と悲観的ロックの下に置きます。
-
オプティミスティック・ロックバージョン番号とタイムスタンプによって達成一般的にデータ競争力の弱いシーンのために使用され、より少ない読み書き、。
-
ペシミスティック・ロック通常、データの激しい競争のシーンのために使用さは、各操作は、データをロックします。
データをロックするには、に対処するため、特定のロック戦略が必要です。
-
表ロック、テーブル全体をロックし、最小のオーバーヘッドが、競争がロックを強化します。
-
行ロック、行レベルのロック、最も高価な、しかし同時実行のサポートの最大の程度。
しかし、ストレージエンジンMySQLの実際の実装は、通常、マルチバージョン同時実行制御(MVCC)を達成するために、単純な行レベルのロッキングではありません。MVCCは、ロック操作は、ほとんどの場合、低コストで回避され、行レベルロックの変異体です。MVCCスナップショットは、データを保存する時にポイントを介して達成されます。
1.3トランザクション
トランザクションは、オペレーションの原子セットを保証し、どちらかのすべてが成功するか、すべて失敗します。それはロールバックする前に、すべての操作を失敗するはずです。明示的にトランザクション、トランザクションとして各クエリを起動しない場合、MySQLは自動、提出します。
分離レベルは、可視およびトランザクション内のトランザクション間でトランザクションの変更を制御します。一般的な4つの分離レベル:
-
非コミット読み取り(READ UNCOMMITTED)、また目に見えるその他の事項に提出していない場合でも、トランザクションを変更します。トランザクションは、ダーティリードが得られ、コミットされていないデータを読み取ることがあります。
-
コミット読み取り(コミット読み取り)、トランザクションの開始時に、唯一の企業が行うための修正を提出されました見て。コミットされていないトランザクションの前に、他のトランザクションに加えられた変更は表示されません。また、非反復可能読み取りとして知られている、私は何度も同じトランザクションが異なる可能性が同じレコードを読み取ります。
-
反復可能読み取り、同じトランザクション内で同じレコードを複数回の結果の結果を読み、同じ時間(RepeatTable読み取りを)。
-
シリアライズ分離の(直列化)、最高レベル、トランザクションシリアル実行を強制します。
1.4ストレージエンジン
InnoDBエンジン、最も重要で最も広く使われているストレージエンジン。高パフォーマンスと自動クラッシュリカバリの特性を有する、短期の多数のトランザクションを処理するように設計されています。
トランザクションと行レベルのロックをサポートしていないのMyISAMエンジンは、セキュリティがクラッシュ後に復元することはできません。
2最適化を作成します。
2.1スキーマのデータ型と最適化
整数
TINYINT、SMALLINT、MEDIUMINT、INT、のBigInt記憶空間を使用して格納8,16,24,32,64ビット。負の数値を使用することを許可されていない場合は符号なし、あなたはラインの倍増に正の数を作ることができます。
リアル
-
フロート、ダブル、おおよその浮動小数点演算をサポートしています。
-
小数、小数の精度を格納します。
弦
-
可変長文字列を格納VARCHAR、。これは、1つのまたは2の追加レコード長のバイト列が必要です。
-
チャーは、例えばMD5値として、記憶固定長の文字列を、固定長。
-
ブロブ、データおよびデザインの多くを保存するためのテキスト。それぞれ、バイナリ文字を介して。
タイムタイプ
-
日時は、値が、8バイトの広い範囲を保存します。
-
タイムスタンプは、同じUNIXタイムスタンプ、4つのバイトをお勧めします。
最適化のヒントポイント
-
対応するデータ型を利用すること。たとえば、IP保存不可欠で、文字列型との時間を節約しません。
-
小さいデータ型を選択してください。TINYINTはINTすることはできません。
-
ID列(識別子列)、文字列型が推奨されていない、整数を使用することをお勧めします、整数より多くのスペース、および計算速度遅くを取ります。
-
ORMは、一般的に大規模なVARCHARタイプ、インデックス不合理な使用やその他の問題を使用して、データの種類に焦点を当てていない、スキーマを生成し、自動的に推奨されていません。
-
実シーンミックスパラダイムとカウンターパラダイム。冗長高いクエリ効率、低挿入更新効率、低挿入冗長高い更新効率、低クエリ効率。
-
要約完全に独立したキャッシュテーブルを作成し、データを生成するタイミングは、ユーザーが操作のために長い時間がかかります。高精度要件の概要操作では、高速なクエリの目的を達成するために、最新の結果+の結果の履歴レコードを使用することができます。
-
使用する新しいテーブルの目的に影響を与えずにデータの移行、アップグレードプロセステーブルは、履歴データの保存に、元のテーブルを変更することで、テーブル名をシャドー・テーブルを使用することができます。
2.2インデックス
1つ以上の列を備えたインデックス値。MySQLのインデックスの接頭辞左の列の唯一の最も効率的な使用。利点のインデックス:
-
データクエリスキャンの量を減らし
-
発注・テーブルゼロを避けます
-
順序はランダムIO IO(IO効率がランダムな順序IOよりも高い)になります
Bツリー
ほとんどのインデックスのタイプを使用。データを格納するために使用Bツリーデータ構造(各葉ノードは、それによってリーフノードのトラバースを容易、次のリーフノードへのポインタを含みます)。全キー、キーレンジ、キープレフィックス検索に適用B-Treeインデックスは、ソートをサポートしています。
Bツリー索引の制限:
-
それは左端の列のインデックスに基づいていない場合は、インデックスを使用することはできません、問い合わせるようになりました。
-
あなたは、インデックスの列をスキップすることはできません。あなたが最初の列と3列目のインデックスを使用する場合は、インデックスのみの最初の列を使用することができます。
-
範囲クエリのクエリがある場合は、その右側にあるすべての列がクエリを最適化するためにインデックスを使用することはできません。
ハッシュインデックス
すべての列のインデックスの唯一の完全一致、クエリが有効です。すべてのストレージエンジンは、索引に格納されたすべてのハッシュインデックスのハッシュコードをハッシュコードインデックス列を計算し、各データラインへのポインタを格納します。
ハッシュインデックスの制限:
-
これは、ソートに使用することはできません
-
これは、部分一致をサポートしていません。
-
のみ=、IN()と同等のクエリをサポートし、<サポートしていません>
最適化のヒントポイント
-
該当する各インデックスのそのスコープと制限に注意してください。
-
列インデックスは、パラメータの発現または機能は、障害の一部である場合。
-
特に長い文字列の接頭辞インデックスの選択性指数を有する適切なプレフィックス長を選択するために使用されてもよいです。
-
複数列のインデックスを使用する場合、AND及びOR文法によって接続することができます。
-
インデックスを複製することは、(A、B)のように、必要ではなく、(A)が繰り返されます。
-
インデックスは、クエリの構文によって条件どこクエリおよびグループに特に有効である場合。
-
最後のクエリ、右のインデックスの故障による問題を防ぐために、クエリの範囲の条件での問い合わせの範囲。
-
インデックスは長すぎる、とインデックス列がnullであってはならない文字列を選択するのが最善ではありません。
美しくビデオ共有を学びます:
リンク:https://pan.baidu.com/s/1v5gm7n0L7TGyejCmQrMh2g抽出コード:x2p5
Xの共有すること自由に、しかし重大な制約、リンクをクリックするか、リンクが検索に加えて、集団グループ番号失敗する936 682 608。
3最適化されたクエリ
問い合わせ3.1の品質の三つの重要な指標
-
応答時間(サービス時間、キュー時間)
-
走査線
-
リターンライン
3.2クエリの最適化のポイント
-
すべての列を返すように*選択クエリにこのような用途として無関係の列を、避けてください。
-
クエリに依存しないの行を避けます
-
セグメンテーションクエリ。サーバー上の大きな圧力のタスクは、長い時間をで分解し、複数の実行中にします。1万データポイントを削除するには、一時停止の実施期間が終了した後10回、毎回実行し、続行することができます。プロセス・サーバーのリソースを他のタスクに解放することができます。
-
クエリに関連した分解。最初のマルチテーブルクエリは、複数の単一テーブルのクエリに分解し、クエリに関連付けられています。ロック競合を減らすことができ、クエリ自体のクエリ効率が比較的高いです。接続と切断操作ためMySQLは効率が得られ、クエリが複数回に分割されていないので、軽量です。
-
操作だけでヌル列ではありませんので、行数の合計数がカウント数(*)を使用して統計を数えることができることに注意してください。
-
高い充填効率の識別に応じて、カラムによるグループは、パケットの結果が列グループの列を越えて移動するべきです。
-
リレーショナルクエリに関連する遅延は、ベースの再関連付けを自分の検索条件を絞り込むために照会することができます。
-
ページの最適化を制限します。走査は、インデックスに従って被覆し、次いで欄に係る自体関連する他の列を照会することができます。として
-
選択する
-
ID、
-
名前、
-
年齢
-
どこ
-
学生S1
-
INNERは (JOINを
-
選択する
-
ID
-
から
-
学生
-
ORDER BY
-
年齢
-
LIMIT 50、5
-
) S2と ON s1.id = s2.id
-
事業は、連合のすべてのより効率的な使用を推奨しなければならない場合にはユニオンクエリは、体重をデフォルトに
サプリメント
テーブル構造タイプフィールドのタイプと条件1矛盾し、MySQLは自動的に障害のパラメータの関数として指数で、その結果、機能を転送添加しました。
2.likeインデックスを打つことができませんでした%で始まり、前のセクションでのクエリを入力していません。
3.バージョン5.7に2つの新機能を補完します:
生成されたカラムは、カラムを与えるために他の列のデータベースから算出されます
-
CREATE TABLEの三角形を(SIDEA DOUBLE、SideBの DOUBLE、領域 DOUBLE AS(SIDEA * SideBの/ 2))。
-
挿入 三角形に(SIDEA、SideBの) 値(3、 4)。
-
*選択し た三角形から。
-
+ ------- + ------- + ------ +
-
| SIDEA | SideBの | エリア|
-
+ ------- + ------- + ------ +
-
| 3 | 4 | 6 |
-
+ ------- + ------- + ------ +
これは、JSON形式のデータをサポートし、ビルトイン機能を提供します
-
CREATE TABLEのjson_test(名 JSONを)。
-
INSERT json_test INTO VALUES('{ "値1"、 "NAME2": "NAME1" "値2"}');
-
SELECT * json_test FROM WHERE JSON_CONTAINS(名前、 '$ .name1');
使用について懸念は、パフォーマンス分析で説明します
EXPLAIN SELECT settleId FROM Settle WHERE settleId = "3679"
-
SELECT_TYPE単純な(単純なSELECT表現、無組合とサブクエリ)、一次(サブクエリがあり、最も外側のSELECTクエリが主である)、ユニオン(第2または後続の組合でクエリを選択していない:、複数の値が存在します結果2回目以降の選択クエリで外部)、依存労働組合(組合に依存して、クエリ結果を外部に依存しています)
-
タイプのシステム(特殊ケースCONST接続タイプであるテーブルのみ一列(=システムテーブル)、)、CONST(定数クエリ)、REF(唯一の一般的な指標にアクセスするための非一意のインデックス)でeq_ref(使用:、複数の値が存在します成分一意のインデックスまたはクエリ)、全て(表クエリ)、インデックス(全クエリインデックステーブル)、範囲(範囲クエリ)
-
possible_keys:テーブルには、インデックスのクエリを助けるかもしれません
-
キー、インデックスを使用することを選択
-
key_lenにインデックス長を使用して、
-
行は、行の数は、大きく悪化スキャン
-
エクストラのみインデックス(索引情報から検索し、スキャンテーブルよりも高速です)、時間が使用される(使用制限)、filesortレコードを使用して(メモリやディスクをソートすることができる)、一時的な(注文クエリ結果を使用して、:、いくつかの値があります)一時テーブルを使用します