自己紹介から始めましょう。
:!@#$%......&*.
その前の会話は省略。
MySQLとOracleをデータベースに使っているところを見ると、普段からSQLをたくさん書いているのですか?
もちろん、古いプロジェクトではMySQLとOracle、新しいプロジェクトではMySQLと、データベースの利用は今でも頻繁に行われています。
MySQL データベースで使用されているストレージエンジンは何ですか?
ストレージエンジンにはInnoDBを使用します。
ストレージ・エンジンはテーブル・レベルですか、それともデータベース・レベルですか?
もちろん、それはテーブル・レベルの話であって、テーブルを構築するためには、ストレージ・エンジンやエンコーディング・フォーマットなどを選択しなければなりません。
InnoDBのデータ分解がどのようなものなのか、理解されていますか?
チャン・サンは、「これは、インターネット上のトレーニング組織が悪く言っていることではないのか、小さなことだ」と思いました。
下はB+の木ですね。
B+の木を使うメリットは何ですか?
通常のバイナリツリーと比較して、B+ツリーのリーフノードは、より多くのデータを格納することができ、B+ツリーを使用して同じ量のデータは、データがディスクの上部に格納されているため、ツリーの高さが少し低くなり、ツリーの高さが低いクエリが少ないことを意味し、より高い効率があるでしょう。B-treeと比較すると、B-treeのデータは各ノードの上に配置されるのに対し、B+ treeのデータはリーフノードの上に配置され、連続的であるため、B+ treeを使用してトラバーサルまたは範囲クエリのパフォーマンスがより優れたものになります。
そのデータベースのトランザクション分離レベルについて何かご存知ですか?
チャン・サンは、B+ツリーについて聞き続けたらどうかと思いました。
データベースのトランザクション分離レベルは、read uncommitted、read committed、repeatable、serialisedの4つに分けられます。
では、それぞれのアイソレーション・レベルは何を解決するためのものなのでしょうか?
コミットされたリードはダーティリードに対処するため、反復可能性は反復不可能性に対処するため、シリアライゼーションはファントムリードに対処するためです。
では教えてください。
ダーティ・リーディングとは、データを照会して、他の人が修正したけれどもコミットしていないデータを読むことです。非再現性の読み取りは、例えば、私は二度読むことで、最初の時間は、私はデータを読んで、二度目は、私は再びデータを読んだが、結果は同じではありません読んで、他の人によって変更され、その結果、問題が発生しました。ファントムリーディングとは......、ファントムリーディングとは、一回目にまとめて読んだデータを、二回目に読み直したら、もう一つデータがあったというもので、幻覚を見ているようなものです。
MySQLのデフォルトのトランザクション分離レベルは何ですか?
張さんは、確かに、あなたが尋ねるほど、深いああ、私はそれが2番目または3番目のような印象を持っている、MySQLとOracleはまだ同じではありません、彼らはすべてのOracleは、より安全であると言うので、私はMySQLの2番目であることを恐れています。
提出されたものを読んだ覚えがあります。
またそれか......。
データベース関連の質問はとりあえず終わり、後の質問は省略します。
良い......。
---------------------------------------------------------------------------
だから、データベースは本当にああ、私たちはよく準備する必要があります多くのことを尋ねることができるので、張三は、データベースの分離レベルで植え、その後、データベースの分離レベルについてのチャット。
繰り返しになりますが、まずそうであるかどうかを分析してください。では、データベースにはいくつの分離レベルがあり、それをどのように検証するのでしょうか?
まず、MySQL の接続ツールのクエリ・ボックスに以下のクエリ・ステートメントを入力して、現在のトランザクションの分離レベルを照会します:
SELECT @@global.tx_isolation得られた結果
REPEATABLE-READのクエリの結果を見てください。この単語は文字通り繰り返し読み取りを意味します。まあ、この知識は簡単に扱えるので、覚えておいてください。
set global transaction isolation level read committedこのような文言でアイソレーション・レベルを設定することができますが、実際にどのようなアイソレーション・レベルがあるのか、試さずにどうやって知るのですか?
4つのアイソレーション・レベルがあることはお分かりいただけたと思いますので、そのレベルについて説明しましょう。 長い間、他の人たちがカバーしてきたことですが、やはりきちんとカバーする必要があります。
: 上記のダーティ・リード問題を解決するために、コミットされたリードに対応する分離レベルがあるのですか?それはどのように動作しますか?先ほど、他のコミットされていないトランザクションの実行結果を読むことができると言いましたが、この隔離レベルではこの点を封印することは線上にありません、私はあなたが他の人が変更したが、コミットされていない結果を読むことは許可しません。コミットされていない他の人の修正結果を読むことは許可しません。待ってください、他の人があなたの読み終わった部分をコミットするまで待ってください。この分離レベルはOracleとSQLServerのデフォルトの分離レベルです。これでファントム・リードの問題は解決し、ほとんどの問題は解決したように見えますが、再現不可能なリードという問題もあります。つまり、トランザクションで初めてレコードを読み込んだ後、他のトランザクションがこのデータを変更し、私は再びそれを読んで、私は変更されていないか、または変更後に読み込むのですか?残念ながら、このトランザクションでは、他の人が読み取りに影響を与えないという保証はありません、つまり、異なる値を2回読み取ることが可能であり、場合によっては問題が発生する可能性があります。
そこで4つの分離レベルが導入され、発生する可能性のある問題に対応し、ところで、クエリの分離レベルとステートメントの分離レベルを変更することも与えられている、あなたは自分自身を確認する必要がある場合は時間があります。
では最後の質問ですが、なぜMySQLのデフォルトのトランザクション分離レベルは繰り返しリードなのでしょうか?
その後、得られた知識に応じて、データベースのトランザクションの分離レベルは、明らかにデータベース開発者に応じて、より強くする能力の分離レベルは、デフォルトではどのような分離レベルを必要とすると思う、問題を解決することです。データベース開発者の視点に立ってそれについて考えるには、まず第一に、コミットされていない何もしない読み取り、さらに他の人のトランザクションは、私が読むことができない場合があります変更を行うには、問題は非常に大きいですが、それは問題が発生しやすい、それはデフォルトの分離レベルとして、このレベルを選択することは不可能です。そしてシリアライゼーションは非常に非効率的であり、多くの場合*ファントムリード*の問題を解決するためには、実際には問題ではありませんが、この分離レベルの選択は、それが得るよりも多くを失う可能性があります。それは、読み取りがコミットされており、選択で繰り返し読み取りになり、先に述べたように、繰り返し読み取りの分離レベルは、再現性のない読み取りの問題を解決することであり、再現性のない読み取りのケースは少なく、いくつかのビジネスのための1つは、唯一の問題の設計ではなく、ビジネスのロジックであると言うことができますので、本質的に実際に繰り返し読み取りの問題を解決するために、必ずしも必須ではありませんが、私の意見では、これらの2つです。が望ましいですが、それはちょうどどのように高い要件と高いパフォーマンスのトレードオフに依存します。
しかし、他のデータベースはデフォルトの分離レベルとしてリード・コミットを選択しています。あなたの性格のせいではありませんよね?
もう少し深く言うと、このレベルでは自分で正誤を確認するのは実は難しく、他の人の発言と自分の考えを組み合わせて初めて答えが出るのです:
- MySQLのデフォルトのトランザクション分離レベルである繰り返し読み取りは、マスター・スレーブ・レプリケーションの歴史的な理由に関連しています。
- MySQLのマスター-スレーブレプリケーションは、binlogに基づいている - binlogについてがあり、それについて簡単に:binlogは、データベース操作のためのユーザーのSQLステートメントに関する情報を記録するために使用されるMySQLのデータベースのバイナリログ、つまり、データベースはどのような変更を行うには、binlogに記録されています。
- MySQL5.0のbinlogのみサポートSTATEMENTモードでは、読み取りでこのモードは、可能な問題にコミットされている - 3つのモードでbinlog:STATEMENTモードは、つまり、それぞれがbinlogに記録されるSQLのデータベースを変更します。 ROWは、各SQLステートメントのコンテキストを記録していない、どのデータが変更された記録のみ、何に変更されました。MIXED上記2つの混合は、STATEMENTモードを使用して一般的なレプリケーションは、STATEMENTモードは、ROWモードを使用して操作をビンログを保存するために複製することはできません。
- マスター・スレーブ間のレプリケーションで発生する可能性のあるデータの不整合という問題を解決するために、MySQLは分離レベルとして繰り返し読み取りを選択し、現在に至っているのですが、なぜこの問題が発生するのか、なぜ容量の問題で設定後に解決されるのかについては、自分で調べるしかありません。





