Mysql は、高性能のデータ ストレージ サービスを提供する主流のオープン ソース リレーショナル データベースです。バックエンド開発を行う場合、
パフォーマンスのボトルネックが発生することがありますが、これらのボトルネックはアプリケーション自体に起因するものではなく、データベース レベルに起因する場合があります。
したがって、Mysql の基礎となる原則のいくつかを習得することは、Mysql をより深く理解し、Mysql でパフォーマンス チューニングを実行し、
その結果、高パフォーマンスのバックエンド サービスを開発するのに役立ちます。
1. mysql の論理フレームワーク
mysql の論理フレームワーク図は次のとおりです:
最上位層クライアントを処理します。
主に接続処理、認可認証、セキュリティなどを行います。 Mysql は、クライアントからの接続を処理するために、この層でスレッド プールを維持します。 Mysql はユーザー名とパスワードの認証を使用できますが、 は SSL ベースの X.509 証明書認証も使用できます。2 番目の層は、クエリ キャッシュ、パーサー、オプティマイザーの 3 つの部分で構成されます。パーサーは SQL ステートメントの解析に使用され、オプティマイザーは解析されたステートメントを最適化します。 クエリを解析する前に、サーバーはまずクエリ キャッシュをチェックします。対応するクエリ結果がキャッシュ内に見つかった場合は、クエリの解析や最適化などを必要とせずに、クエリ結果が直接返されます。ストアド プロシージャ、トリガー、ビューなどはすべてこの層に実装されます。
3 番目の層はストレージ エンジンです。ストレージ エンジンは、MySQL へのデータの保存、データの抽出、トランザクションの開始などを担当します。ストレージ エンジンは、API を介して上位層と通信します。これらの API は、異なるストレージ エンジン間の差異を保護し、上位層のクエリ プロセスに対してこれらの差異を透過的にします。ストレージ エンジンは SQL を解析しません。 mysql で最も一般的に使用されるストレージ エンジンは InnoDB です。
2. mysql の同時実行制御複数のスレッドが同時にデータを操作すると、同時実行制御の問題が発生する可能性があります。
2-1. 読み取り/書き込みロック複数のスレッドがデータの読み取りのみを行う場合、実際には、相互に影響を与えることなく一緒にデータを読み取ることができます。共有ロックとも呼ばれる「読み取りロック」を使用します。
読み取りロックを取得したスレッドは互いにブロックせず、同時にリソースを読み取ることができます。
スレッドがデータを書き込む必要がある場合、「書き込みロック」を使用する必要があります。これは排他ロックにもなります。
書き込みロックは、書き込み操作が完了するまで他の書き込みロックと読み取りロックをブロックします。
2-2. ロックの粒度最初に概念を明確にします: 特定のリソース上で、ロックする必要があるデータが少ないほど、システムが実行できる同時実行性が高くなります。 . 高いほど。
ただし、ロックによってもリソースが消費されます。システムがデータへのアクセスではなくロックの管理に多くの時間を費やしている場合、
システムのパフォーマンスに影響が出る可能性があります。
したがって、優れた「ロック戦略」は、ロックのオーバーヘッドとデータ セキュリティの間のバランスを見つけることです。Mysql は複数のストレージ エンジン アーキテクチャをサポートしています。
各ストレージ エンジンには、独自のロック戦略を実装でき、ロックの粒度。
2-3. テーブル ロックと行ロックテーブル ロックは、その名前が示すように、テーブル全体をロックします。テーブルロックのオーバーヘッドは比較的小さいです。テーブルに書き込みロックを追加すると、他のユーザーによるテーブルに対するすべての読み取りおよび書き込み操作がブロックされます。
Mysql では、ストレージ エンジンが独自のロックを提供できますが、Mysql は ALTER TABLE などのステートメントなどのテーブル ロックを使用することがあります。
書き込みロックは読み取りロックよりも優先度が高いため、書き込みロック要求は読み取りロック キューの先頭に挿入される場合があります。
行レベルのロックは行全体をロックするため、同時処理を最大限にサポートできますが、ロック解除のコストも比較的高くなります。行レベルのロックは、ストレージ エンジン層でのみ実装されます。
すべてのストレージ エンジンは、独自の方法で行レベルのロックを実装します。
3. MVCCMVCC は「マルチバージョン同時実行制御」です。MVCC は行レベルのロックの一種であると考えることができますが、多くの場合、行レベルのロックの数を増やす必要があります。ロック操作、
なので、オーバーヘッドが低くなります。
主流のリレーショナル データベースはすべて MVCC を実装していますが、実装メカニズムは異なります。実際、MVCC には統一された標準がありません。
しかし、それらのほとんどはノンブロッキング読み取り操作を実装しており、書き込み操作は必要な行のみをロックします。
MVCC は、実行中の各トランザクションで表示されるデータの一貫性を保証します。
ただし、異なるトランザクションは異なるタイミングで開始されるため、同じテーブルに対して同時に表示されるデータは異なる可能性があります。
Mysql の InnoDB エンジンは、レコードの各行の背後に 2 つの非表示列を保存することによって実装されます。
1 つは行の作成時間を保存し、もう 1 つは行の有効期限 (または削除時間) を保存します。
実際には、保存されるのは実際のタイムスタンプではなく、「システムのバージョン番号」です。
トランザクションが開始されるたびに、システムのバージョン番号が増加します。トランザクションが開始されると、システムのバージョン番号がトランザクションのバージョン番号として使用され、クエリされた行のバージョン番号と比較するために使用されます。
次に、一般的な CRUD 操作でバージョン番号がどのように機能するかを紹介します。
INSERT現在のシステム バージョンを行バージョン番号として保存します
DELETE現在のシステムのバージョン番号をこのデータ行の「バージョンの削除」に保存します。 #########アップデート######
新しいレコード行を挿入し、現在のシステム バージョン番号をナビゲーション バージョン番号として保存し、現在のシステム バージョン番号を元の行の「削除バージョン」に保存します。
SELECT
現在のトランザクション バージョンより前のバージョンの行のみを検索します。これにより、トランザクションによって読み取られた行が
より前に存在していたか、トランザクション自体によって挿入または変更されたことが保証されます。行
の「削除バージョン」は未定義であるか、現在のトランザクションのバージョン番号より大きいです。これにより、トランザクションによって読み取られた行がトランザクションの前に削除されていないことが保証されます。
MVCC は、
REPEATABLE READ と READ COMMITTED
の 2 つの分離レベルでのみ機能し、他の 2 つの分離レベルは機能しません。
は、現在のトランザクション バージョンに一致するデータ行ではなく、常に最新のデータを読み取るためです。そして SERIALIZABLE
は読み取られたすべての行をロックします。 上記は同時実行制御に関するいくつかの問題をまとめたものです。その他の関連する問題については、PHP 中国語 Web サイトの関連チュートリアルを参照してください。
推奨ビデオチュートリアル:
https://www.php.cn/course/list/51/type/2.html以上がMySQL 同時実行制御の原則の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。