インタビューの概要:MySQL Affairsに関する10の質問一般的なインタビューの質問と回答(FQA)

リレーショナルデータベースMySQLを学ぶことは良い出発点です。ほとんどの人はCRUDに慣れていますが、インタビュアーの魂の魂に答えることはできますか?データベースのより深い基礎を理解する必要があります。

この記事は毎週継続的に更新されており、皆さんの「3回連続」は私にとって最大の断言です。WeChatパブリックアカウント「バックエンドテクノロジースクール」を初めて検索できます(通常、ブログよりも1〜2か月前に更新されます)。

インタビューを終えた後、MySQLトランザクションとストレージエンジンに関する10のFAQ(よくある質問)について、ここで知りたいと思います。

トランザクションとは何ですか?

トランザクションは「アトミックSQLクエリのセット」、つまり独立した作業単位です。データベースエンジンが一連のクエリのすべてのステートメントをデータベースに正常に適用できる場合は、一連のクエリを実行します。クラッシュまたはその他の理由によりいずれかのステートメントを実行できない場合、すべてのステートメントは実行されません。つまり、トランザクション内のすべてのステートメントが正常に実行または失敗します。

トランザクション制御構文を知っていますか?

BEGIN 或 START TRANSACTION 显式地开启一个事务;
COMMIT / COMMIT WORK二者是等价的。提交事务,并使已对数据库进行的所有修改成为永久性的;
ROLLBACK / ROLLBACK WORK。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
SAVEPOINT identifier 在事务中创建一个保存点,一个事务中可以有多个 SAVEPOINT;
RELEASE SAVEPOINT identifier 删除一个事务的保存点;
ROLLBACK TO identifier 把事务回滚到标记点;
SET TRANSACTION 用来设置事务的隔离级别。InnoDB 存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE

共通言語を使用して、理解していることについて話します

銀行業務を栗のように使用する場合、ユーザーlemonには2つの銀行カードがあり、1つは中国マーチャントバンクのCMBC給与カードで、もう1つはICBC貯蓄カードです。給与は毎月5日に支払われます。 CCB普通預金口座へ。ここでの銀行の略語の後には、対応するデータテーブルの名前が付いていることに注意してください。覚えていない場合は、私に任せてください。

招商银行(CMBC):“存么?白痴!”
中国工商银行(ICBC): “爱存不存!”
中国建设银行(CCB): “存?存不?”
中国银行(BC): “不存!”
中国农业银行(ABC): “啊,不存!”
民生银行(CMSB):“存么?SB!"
兴业银行(CIB):“存一百。”
国家开发银行(CDB):“存点吧!”
汇丰银行(HSBC):“还是不存!”

画像

この転送操作は、次の手順を含むトランザクションに簡略化できます。

  1. CMBCアカウントの残高が100万を超えるかどうかを確認する
  2. CMBCアカウントの残高から100万を差し引きます
  3. ICBC口座残高に100万を追加

次のステートメントは、転送トランザクションの作成に対応しています。

START TRANSACTION;
SELECT balance FROM CMBC WHERE username='lemon';
UPDATE CMBC SET balance = balance - 1000000.00 WHERE username = 'lemon';
UPDATE ICBC SET balance = balance + 1000000.00 WHERE username = 'lemon';
COMMIT;

トランザクションのACID特性は何ですか?

ACIDは実際にはトランザクション特性の英語の頭字語です。具体的な意味は次のとおりです。

  • 原子性(原子性)
    トランザクションは不可分の最小作業単位と見なされる必要があります。トランザクション全体のすべての操作は、正常に送信されるか、失敗してロールバックされる必要があります。トランザクションの場合、一部の操作のみを実行することはできません。

  • 整合性(整合性)データベースは、常に1つの整合性のある状態から別の整合性のある状態に変換されます。前の例では、一貫性により、システムが3番目と4番目のステートメントの間でクラッシュしても、CMBCアカウントは100万を失うことはありません。そうでない場合、トランザクションが最終的にコミットされないため、レモンが泣き、すべてのトランザクションが変更はデータベースに保存されません。
  • 分離(分離)
    通常、トランザクションによって行われた変更は、最後のコミットまで他のトランザクションからは見えません。前の例では、3番目のステートメントが実行され、4番目のステートメントがまだ開始されていないときに、誰かがレモンCMBCアカウントに預金する準備をしている場合でも、CMBCアカウントに100が表示されます。百万。
  • 耐久性(durability)
    トランザクションがコミットされると、トランザクションによって行われた変更はデータベースに永続的に保存されます。このとき、システムがクラッシュしても、変更されたデータは失われません。耐久性には実際にはさまざまなレベルの耐久性があるため、耐久性はややあいまいな概念です。非常に強力なセキュリティを提供できる永続化戦略もあれば、そうでない場合もあります。そして、「100%の耐久性を保証できる戦略はあり得ない」さもなければ、他に何をバックアップする必要がありますか。

酸

ダーティリーディング、繰り返し不可のリーディング、ファントムリーディングとは何ですか?

汚い読書

トランザクションAがデータを変更した後でデータが送信される前に、別のトランザクションBがこの時点でデータを読み取ります。制御がない場合、トランザクションBはAを読み取ってデータを変更し、次にAが送信前にデータを変更してから、Bが読み取ります。受信したデータはダーティデータであり、このプロセスはダーティリードと呼ばれます。

汚い読書

繰り返し不可

トランザクションで特定のデータを読み取った後のある時点で、以前に読み取られたデータが再度読み取られましたが、読み取られたデータが変更されたか、一部のレコードが削除されたことがわかりました。

画像

ファントムリーディング

トランザクションAがクエリ条件に従ってレコードの範囲を読み取ると、トランザクションBは、範囲内の条件を満たす新しいレコードを挿入します。トランザクションAが条件に従ってレコードを再度クエリすると、条件を満たす新しいレコード(ファントムロウ)
ファントムリーディング

繰り返し不可の読みと魔法の読みの違いは何ですか?

  • 繰り返し不可の読み取りのポイントは変更です。同じトランザクションで、同じ条件下で、最初に読み取られたデータは2回目に読み取られたデータとは異なります。(途中で修正のために提出された他のトランザクションがあるため)
  • ファントム読み取りのポイントは、追加または削除です。同じトランザクションで、同じ条件下で、最初と2回目に読み取られる「レコード数」は異なります。(途中で挿入/削除された他のトランザクションがあるため)

SQLの4つの分離レベルを知っていますか?解決された特定の問題は何ですか?

SQLは4つの標準分離レベルを実装します。各分離レベルは、トランザクションで行われた変更を指定します。これらはトランザクション内およびトランザクション間で可視であり、そうではありません。低レベルの分離レベルは、通常、より高い同時処理をサポートし、システムのオーバーヘッドが低くなります。
分離レベル

さまざまな分離レベルにより、ダーティリード、繰り返し不可のリード、ファントムリードをさまざまな程度に解決できます。分離レベルには独自の長所があり、完璧なソリューションはありませんが、ビジネスシナリオ外の特定の実装について話すことは不正です。

分離レベルの比較

MySQLのどのストレージエンジンがトランザクションをサポートしていますか?

MySQLのInnoDBおよびNDB Clusterストレージエンジンは、トランザクション処理機能だけでなく、トランザクションをサポートする他のサードエンジンも提供します。

自動提出とは何ですか?

MySQLのデフォルトは自動送信AUTOCOMMITモードです。つまり、トランザクションが明示的に開始されていない場合、各クエリはコミット操作を実行するトランザクションとして扱われます。

MyISAMやメモリテーブルなどのトランザクションテーブルの場合、変更AUTOCOMMITは効果がありません。このタイプのテーブルにはCOMMITまたはROLLBACK概念はありません。これは、常にAUTOCOMMIT有効モードの場合と同等であると言えます。

ストレージエンジンをトランザクションに混在させることはできますか?

同じトランザクションで複数のストレージエンジンを使用しないようにします。MySQLサーバーレイヤーはトランザクションを管理しません。トランザクションは、基盤となるストレージエンジンによって実装されます。

トランザクション内にトランザクションテーブルと非トランザクションテーブル(InnoDBテーブルやMyISAMテーブルなど)を混在させる場合、通常のコミットでは問題はありません。

ただし、トランザクションをロールバックする必要がある場合、非トランザクションテーブルの変更を元に戻すことができないため、データベースが不整合な状態になります。この状況を修復するのは困難であり、トランザクションの最終結果を判別できません。したがって、各テーブルに適切なストレージエンジンを選択することが非常に重要です。

MySQLストレージエンジンのタイプは何ですか?

最も一般的に使用されているストレージエンジンは、InnoDBエンジンとMyISAMストレージエンジンで、MySQLのデフォルトのトランザクションエンジンはInnoDBです。

データベーステーブルで現在サポートされているエンジンを表示します。

show table status from 'your_db_name' where name='your_table_name'; 
查询结果表中的`Engine`字段指示存储引擎类型。

InnoDBストレージエンジンの機能とアプリケーションシナリオ?

InnoDBは、MySQLのデフォルトの「トランザクションエンジン」であり、多数の短期トランザクション(短期トランザクション)を処理するように設定されています。短期トランザクションのほとんどは、通常送信され、ほとんどロールバックされません。

InnoDBトランザクションモデルの詳細については、公式のMySQLマニュアルを参照し、https//dev.mysql.com/doc/refman/5.7/en/innodb-transaction-model.htmlにリンクを投稿してください。

歴史

現在のMySQLバージョンのInnoDBは、歴史的にInnoDBプラグインと呼ばれています。このMySQLプラグインは2008年に開発されました。OracleがSunを買収したのは2010年になってから、MySQL5.5のリリースによって古いバージョンのInnoDBがInnoDBプラグインに正式に置き換えられました。これまでのところ、「スペアタイヤ」は、プラグインではなくMySQLのロイヤルエンジンに成功しています。

画像

特徴

マルチバージョン同時実行制御(MVCC)は、高い同時実行性をサポートするために使用されます。そしてnext-key locking、ファントムリーディングの出現を防ぐギャップロック戦略を通じて、4つの標準的な分離レベルを達成します。

エンジンのテーブルはクラスター化インデックスに基づいており、主キークエリに対して高いパフォーマンスを発揮します。ただし、そのセカンダリインデックスにsecondary indexは、非プライマリキーインデックスのプライマリキーカラムが含まれている必要があるため、プライマリキーカラムが大きい場合、他のすべてのインデックスも大きくなります。したがって、テーブルに多くのインデックスがある場合、主キーはできるだけ小さくする必要があります。さらに、InnoDBのストレージフォーマットはプラットフォームに依存しません。

InnoDBは、ディスクからデータを読み取る方法で予測可能な先読み、メモリ内にハッシュインデックスを自動的に作成して読み取り操作を高速化するアダプティブハッシュインデックス(アダプティブハッシュインデックス)、挿入操作を高速化できるものなど、多くの最適化を行いました。バッファーの挿入(バッファーの挿入)など

InnoDBは、いくつかのメカニズムとツールを通じて真のホットバックアップをサポートしています。MySQLの他のストレージエンジンは、ホットバックアップをサポートしていません。一貫したビューを取得するには、すべてのテーブルへの書き込みを停止する必要があります。読み取りと書き込みが混在するシナリオでは、書き込みを停止することもできます読むのをやめる。

MyISAMストレージエンジンの特性とアプリケーションシナリオは何ですか?

MyISAMは、MySQL 5.1以前のデフォルトのストレージエンジンです。MyISAMは、フルテキストインデックス作成、圧縮、空間関数(GIS)など、多くの機能を提供しますが、読み取り専用データの場合、MyISAMは「トランザクションと行レベルのロックをサポートしない」か、テーブルが比較的小さく、修復操作を許容できるため、引き続き使用できます。それ。

特徴

MyISAMは「行レベルのロックをサポートしていませんが、テーブル全体をロックしています」。読み取り時に読み取る必要があるすべてのテーブルに共有ロックが追加され、書き込み時にテーブルに排他ロックが追加されます。ただし、テーブルには読み取り操作がありますが、同時挿入と呼ばれる新しいレコードをテーブルに挿入することもできます。

MyISAMテーブルは、検査または修復操作を手動または自動で実行できます。ただし、トランザクション回復やクラッシュ回復とは異なり、「データ損失」が発生する可能性があり、修復操作は非常に遅くなります。

でも、MyISAMテーブルの場合、BLOBおよびTEXT同じ長さフィールド、それはまた、インデックスを作成するために、最初の500個の文字に基づくことができ、MyISAMテーブルは、複雑なクエリをサポートするために作成した索引語に基づいており、「フルテキストインデックス処理を、」サポートされています。

DELAY_KEY_WRITEオプションが指定されている場合、変更されたインデックスデータは、各変更の実行が完了した直後にディスクに書き込まれませんが、メモリのキーバッファーに書き込まれます。対応するインデックスブロックをディスクに書き込みます。この方法により、書き込みパフォーマンスが大幅に向上しますが、データベースまたはホストがクラッシュすると、「インデックスの損傷」が発生し、修復操作を実行する必要があります。

InnoDBとMyISAM

あまり多くのことを言ったので、私は一目で覚えていません。以下に示すように、2つのエンジンの主な違いを簡単にリストした表を挙げます。
エンジン比較

その他のストレージエンジン

MySQLは、メモリエンジン、NDBクラスタエンジン、CSVエンジンなど、他のいくつかのストレージエンジンもサポートしています。これらのエンジンは、前述のInnoDBやMyISAMでは一般的に使用されないため、ここでは紹介していません。興味がある場合は、MySQLのドキュメントにアクセスして理解してください。こちらも公式リンクです:https : //dev.mysql.com/doc/refman/5.7/en/storage-engines.html
エンジンリスト

もう少し言って

この記事はMySQLの基本です。この知識を理解しやすく、グラフと組み合わせた形で整理しようとしています。基本的で基礎的な知識が多ければ多いほど、調査や学位の習得が容易になります。調査ポイントとして、MySQLトランザクションとストレージエンジンを読んだ後は、比較的完全に理解できるはずです。

最後に、お読みいただきありがとうございます。記事の目的は、知識の理解を共有することです。テキストに明らかな不備がある場合は、ディスカッションで一緒に学習することを指摘できます。

独創性は簡単ではありません。ここで指を動かすのを見て、全員の「3つのリンク」が私の継続的な作成の最大のサポートです。

WeChatパブリックアカウント「バックエンドテクノロジースクール」を検索し、私が用意したさまざまなプログラミング学習資料で「データ」に返信できます。記事は毎週継続的に更新されます。またお会いしましょう!

参考文献

https://book.douban.com/subject/23008813/

https://juejin.im/post/5c519bb8f265da617831cfff#comment

https://tech.meituan.com/2014/08/20/innodb-lock.html

https://blog.csdn.net/shellching/article/details/8106156

https://coolshell.cn/articles/6790.html

https://zhuanlan.zhihu.com/p/29166694

https://dev.mysql.com/doc/refman/5.7/en/storage-engines.html

https://www.zhihu.com/question/27876575

https://www.runoob.com/mysql/mysql-transaction.html

https://blog.csdn.net/qq_35642036/article/details/82820178?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

https://github.com/CyC2018/CS-Notes/blob/master/notes/MySQL.md#b-tree-principle

おすすめ

転載: www.cnblogs.com/NanoDragon/p/12650049.html