(1)Mysqlの履歴と「querysql」の実行プロセス

1.Mysqlの開発履歴

時間 マイルストーン
1996年 MySQL1.0がリリースされました。その歴史は、著者のモンティがBASICを使用してレポートツールを設計した1979年にさかのぼることができます。
1996年10月 3.11.1リリース:MySQLには2.xバージョンがありません
2000年 ISAMがMylSAMエンジンにアップグレードされました。MySQLはオープンソースです。
2003年 MySQL 4.0がリリースされ、InnoDBストレージエンジンが統合されました。
2005年 MySQLバージョン5がリリースされ、ビューやストアドプロシージャなどの機能が提供されます。
2008年 MySQL ABはSunに買収され、SunMySQLの時代に入りました。
2009年 OracleはSunを買収し、OracleMySQLの時代に入りました。
2010年 MySQL 5.5がリリースされ、InnoDBがデフォルトのストレージエンジンになりました。
2016年 2016年、MySQLはバージョン8.0.0をリリースしました。なぜ6、7がないのですか?5.6は6.xと見なすことができ、5.7は7.xと見なすことができます

MySQLはオープンソースであるため(そして商用バージョンもあります)、Linuxと同様に、MySQLの安定バージョンに基づいて多くのブランチが開発されています。Ubuntu、RedHat、CentOS、Fedora、Debianがあります。

CentOS 7にはMariaDBoが付属しているため、誰もがMySQLブランチに最も精通しているのはMariaDBです。それはどのようにして生まれたのですか?OracleがMySQLを買収した後、MySQLの創設者の1人であるMontyは、MySQLデータベース開発の将来について心配していたため(開発は遅く、クローズドであり、クローズドソースである可能性があります)、新しいものを使用してブランチMariaDB(2009)を作成しました。デフォルトのMariaストレージエンジン。これは、元のMylSAMストレージエンジンのアップグレードバージョンです。

その他の人気のあるブランチ:
Percona ServerはMySQLの重要なブランチの1つです。InnoDBストレージエンジンに基づいて、パフォーマンスと管理のしやすさが改善され、最終的にXtraDBエンジンの拡張バージョンが形成されました。サーバーハードウェアのパフォーマンス。

中国には、NetEaseのInnoSQLやJishu YunzhouのArkDBoなど、MySQLのブランチや自社開発のストレージエンジンもいくつかあります。

Linuxシステムのコマンドライン、データベースツールNavicat、プログラムなど、Java言語のJDBC APIやORMフレームワークなど、データベースを操作するさまざまな方法があります。

私たちのツールやプログラムがデータベースに接続されたときに実際に何が起こったのか考えたことはありますか?内部ではどのように機能しますか?

例としてクエリステートメントを取り上げ、MySQLのワークフローがどのようなものか見てみましょう。

2.クエリSQLステートメントの実行プロセス

ここに画像の説明を挿入

2.1接続

私たちのプログラムまたはツールがデータベースを操作したいのですが、最初のステップは何ですか?データベースとの接続を確立します。

MySQLサービスによって監視されるデフォルトのポートは3306です。クライアントがサーバーに接続する方法はたくさんあります。同期または非同期、長い接続または短い接続、TCPまたはUnixソケット、MySQLには特別な接続モジュールがあり、接続には認証権限が必要です。

MySQLが現在持っている接続の数を確認するにはどうすればよいですか?

show statusコマンドを使用して、スレッドをあいまい一致させることができます。

show global status like 'Thread%';
フィールド 意味
キャッシュされたスレッド キャッシュ内のスレッド接続の数
接続されたスレッド 現在開いている接続の数
作成されたスレッド 接続を処理するために作成されたスレッドの数
実行中のスレッド 非スリープ状態の接続数は、通常、同時接続の数を指します

質問:スレッドを表示するための接続数はなぜですか?クライアントの接続とサーバーのスレッドの間の関係は何ですか?

クライアントが接続またはセッションを生成するたびに、それを処理するためのスレッドがサーバー上に作成されます。逆に、セッションを強制終了する場合は、強制終了スレッドです。
スレッドを割り当てているため、接続を維持するとサーバーリソースが確実に消費されます。MySQLは、長期間非アクティブであった接続を自動的に切断します(SLEEP)。

2つのパラメータがあります:

show global variables like 'wait timeout'; -- 非交互式超时时间,如 JDBC 程序
show global variables like 'interactive timeout'; -- 交互式超时时间,如数据库工具

デフォルトは28800秒、8時間です。
接続はリソースを消費するため、MySQLサービスで許可されるデフォルトの最大接続数(つまり、同時数)はいくつですか?

バージョン5.7では、デフォルトは151で、最大値は100,000に設定できます。

show variables like 'max connections';

パラメータレベルの説明:
MySQLのパラメータ(変数)はセッションレベルとグローバルレベルに分けられ、現在のセッションとグローバルで有効ですが、すべてのパラメータに2つのレベルがあるわけではありません。たとえば、max_connectionsにはグローバルレベルしかありません。

パラメータがない場合、デフォルトはクエリと変更を含むセッションレベルです。
たとえば、パラメータを変更した後、このウィンドウのクエリはすでに有効になっていますが、他のウィンドウは有効ではありません。

show variables like 'autocommit';
set autocommit = on;

したがって、一時的な変更にすぎない場合は、セッションレベルを変更することをお勧めします。他のセッションで有効にする必要がある場合は、グローバルパラメータを明示的に追加する必要があります。

クエリステートメントを実行した後、クライアントがサーバーとの接続を確立した後はどうなりますか?次のステップは何ですか?

2.2クエリキャッシュ

MySQLにはキャッシュモジュールが付属しています。
質問を考えてみましょう。500万行のデータがあり、インデックスがないテーブルがあります。まったく同じSQLステートメントを2回実行すると、2回目は速くなりますか?

回答:いいえ、mysqlのキャッシュもサイズに制限があるためです。一度に500万のデータをキャッシュすることは不可能です。

聞き返します:

select * from user u where u.name = 'xhc';

上記のSQLステートメントはキャッシュを使用しますか?
答えは次のとおりです。キャッシュが有効にならないのはなぜですか。MySQLのキャッシュはデフォルトでオフになっています。

show variables like 'query_cache%';

デフォルトのクロージャーは、推奨されないことを意味します。MySQLが組み込みキャッシュの使用を推奨しないのはなぜですか?主な理由は、MySQLの組み込みキャッシュのアプリケーションシナリオが制限されていることです。1つ目は、SQLステートメントが完全に同じで、中央にスペースがあり、大文字と小文字が異なるとSQLが異なると見なされる必要があることです。 。

2つ目は、テーブル内のデータが変更されると、このテーブルのすべてのキャッシュが無効になるため、大量のデータが更新されるアプリケーションには適していません。
したがって、キャッシュについては、ORMフレームワーク(たとえば、MyBatisではデフォルトで第1レベルのキャッシュが有効になっています)、またはRedisなどの独立したキャッシュサービスにキャッシュを渡して処理します。

MySQL 8.0では、クエリキャッシュが削除されました。

2.3構文解析と前処理(パーサーとプリプロセッサー)

このステップで行う主なことは、SQL文法に基づいて、ステートメントに対して字句解析構文解析、および意味解析を実行することです。

2.3.1字句解析

字句解析は、完全なSQLステートメントを個々の単語に分割することです。たとえば、単純なSQLステートメントは次のとおりです。

select name from user where id = 1;

8つのシンボル、各シンボルのタイプ、および開始位置と終了位置に分割されます。

2.3.2構文解析

2番目のステップは文法分析です。これは、一重引用符が閉じているかどうかなど、SQLに対していくつかの文法チェックを実行し、MySQLで定義された文法規則に従ってSQLステートメントに基づいてデータ構造を生成します。このデータ構造を解析ツリー(select lex)と呼びます

字句構文解析は非常に基本的な機能です。JavaコンパイラとBaidu検索エンジンが文を認識したい場合は、字句構文解析も必要です。
データベースミドルウェアの場合、SQLを解析してルーティング機能を完了するには、Mycat、Sharding-JDBCなどの字句解析関数と構文解析関数も必要です。

質問:正しい字句および文法用語を使用してSQLを記述したが、テーブル名またはフィールドが存在しない場合、エラーはどこに報告されますか?それはデータベース内のエグゼキュータまたはパーサーですか?といった:

select * from xhc;

実際、解析中にエラーが報告され、SQLの解析のリンクにプリプロセッサがあります。生成された解析ツリーをチェックし、パーサーが解析できないセマンティクスを解決します。たとえば、テーブル名と列名の存在をチェックし、名前とエイリアスをチェックして、あいまいさがないことを確認します。
前処理後、新しい解析ツリーが取得されます。

2.4クエリオプティマイザとクエリ実行プラン

2.4.1オプティマイザーとは何ですか?

解析ツリーを取得した後、SQLステートメントが実行されますか?
ここで質問があります。SQLステートメントを実行する方法は1つだけですか?それとも、SQLは、送信したSQLのデータベースによって最終的に実行されますか?

答えはいいえだ。SQLステートメントはさまざまな方法で実行でき、最終的には同じ結果を返します。これらは同等です。しかし、実行方法が非常に多い場合、これらの実行方法をどのように取得できますか?最終的にどちらを選択しますか?どの基準を選択するかによると?

これは、MySQLクエリオプティマイザモジュール(Optimizer)です。

クエリオプティマイザの目的は、解析ツリーに基づいてさまざまな実行プラン(実行プラン)を生成し、最適な実行プランを選択することです。MySQLは、コストが最も少ないコストベースのオプティマイザを使用します。

このコマンドを使用して、クエリのコストを表示できます。

show status like 'Last query cost';

2.4.2オプティマイザーは何ができますか?

MySQLのオプティマイザはどのような最適化タイプを処理できますか?

  1. 複数のテーブルで関連するクエリを実行する場合、どのテーブルデータが参照テーブルとして使用されます。
  2. 複数のケーブルボウがあります|利用可能な場合、どのインデックスを選択するか。

実際、すべてのデータベースにはオプティマイザーモジュールが不可欠であり、複雑なアルゴリズムを使用して、クエリの効率を可能な限り最適化するという目標を達成します。

ただし、オプティマイザは万能薬ではなく、非効率的なSQLステートメントを自動的に最適化できるわけでも、毎回最適な実行プランを選択できるわけでもありません。SQLステートメントを作成するときは、誰もが注意を払う必要があります。

最適化後、何が得られますか?オプティマイザーは、最終的に解析ツリーをデータ構造であるクエリ実行プランに変換します

MySQLの実行プランを表示するにはどうすればよいですか?たとえば、複数のテーブルがクエリに関連している場合、どのテーブルが最初にクエリされますか?クエリを実行するときに使用できるインデックスと、実際に使用されるインデックスは何ですか?

MySQLは、プランを実行するためのツールを提供します。SQLステートメントの前にEXPLAINを追加すると、実行プラン情報を確認できます。

EXPLAIN select name from user where id=1;

詳細情報を取得したい場合はFORMAT=JSON、オプティマイザーtraceoを使用または有効にすることもできます

EXPLAIN FORMAT=JSON select name from user where id=1;

2.5ストレージエンジン

mysqlには、myisam、memory、innodbなどの多くのストレージエンジンがあることがわかっています。テーブルタイプがmyisamのテーブル、およびテーブルタイプがinnodbテーブルタイプのテーブルでは、どのようにデータを格納しますか?

show variables like 'datadir';

デフォルトでは、各データベースには独自のフォルダーがあります。例としてテストデータベースを取り上げます。どのストレージエンジンにもfrmファイルがあります。これはテーブル構造定義ファイルです。

ここに画像の説明を挿入
さまざまなストレージエンジンがさまざまな方法でデータを保存し、さまざまなファイルを生成します。メモリはなく、innodbは1つ、myisamは2つです。

ここにいくつか質問があります:

  1. テーブルタイプはどのように選択されますか?変更できますか?
  2. MySQLがこれほど多くのストレージエンジンをサポートしているのはなぜですか?1つでは不十分ですか?
  3. これらの異なるストレージエンジンの違いは何ですか?

2.5.1ストレージエンジンの選択

テーブルのストレージエンジンは、テーブルの作成時にENGINEキーワードを使用して指定されます。

CREATE TABLE user_innodb' (
id int(11) NOT NULL AUTOINCREMENT,
name varchar(255) DEFAULT NULL,
gender tinyint(1) DEFAULT NULL,
phone varchar(11) DEFAULT NULL,
PRIMARY KEY ('id'),
KEY 'comidx_name_phone' ( name ,'phone')
)ENGINE=InnoDB AUTO_INCREMENT= 1 DEFAULT CHARSET=utf8mb4;

多くの場合、ストレージエンジンを指定せずに、独自のテーブル構築ステートメントを記述します。

指定しない場合、データベースはデフォルトのストレージエンジンを使用します。5.5.5より前のデフォルトのストレージエンジンはMylSAMであり、5.5.5以降のデフォルトのストレージエンジンはInnoDBです。

非常に多くのストレージエンジンの違いは何ですか?

想像してみてください:永続性の問題を考慮せずに高速アクセスを必要と
するテーブルがある場合、データをメモリに配置する必要がありますか?テーブルが履歴データのアーカイブに使用される場合、変更はインデックスを必要としません。データ圧縮をサポートしますか?
読み取りと書き込みを同時に行うビジネスでテーブルを使用する場合、干渉なしに読み取りと書き込みをサポートし、比較的高いデータ一貫性を確保する必要がありますか?

この時点で、これほど多くのストレージエンジンをサポートする必要があるのは、ビジネス要件が異なり、1つのストレージエンジンですべての機能を提供できるわけではないためです。

2.5.2一般的なストレージエンジンの概要

  • MylSAM(3ファイル)の
    アプリケーション範囲は比較的狭いです。テーブルレベルのロックは読み取り/書き込みのパフォーマンスを制限するため、Webおよびデータウェアハウスの構成では、通常、読み取り専用または読み取りベースの作業に使用されます。
    機能:テーブルレベルのロックをサポートします(挿入と更新によりテーブルがロックされます)
    利点:挿入とクエリ(選択)の速度が速くなります。テーブルの行数は(?我々はMylSAMと操作、最初の挿入データを持っているし、その後はInnoDBにストレージエンジンを変更する方法を迅速百万データの挿入データベースに。)(カウント速度が速くなる)が格納されている
    短所:んトランザクションをサポートしていません。
    適切:読み取りなどのデータ分析プロジェクトのみ。
  • InnoDB(2ファイル)mysql5.7
    のデフォルトのストレージエンジン。InnoDBは、トランザクションセーフ(ACID互換)のMySQLストレージエンジンであり、ユーザーデータを保護するためのコミット、ロールバック、およびクラッシュリカバリ機能を備えています。InnoDBの行レベルのロックにより、マルチユーザーの同時実行性とパフォーマンスが向上します。InnoDBは、ユーザーデータをクラスター化インデックスに格納して、主キーに基づく一般的なクエリのI / Oを削減します。データの整合性を維持するために、InnoDBは外部キー参照整合性制約もサポートしています。
    機能: 1。トランザクションと外部キーをサポートするため、データの整合性と一貫性が向上します。
    2.行レベルのロックとテーブルレベルのロックをサポートします。
    3.読み取りと書き込みの同時実行性、書き込み非ブロッキング読み取り(MVCC)をサポートします。
    4.特別なインデックスストレージ方式により、IOを削減できます。、クエリの効率を向上させます。
    適切:頻繁に更新されるテーブル、同時読み取りと書き込みまたはトランザクション処理を備えたビジネスシステム。

ショートストーリー:

InnoDBは元々InnobaseOyによって開発され、MySQLABと協力してInnoDBコードをオープンソース化しました。しかし、MySQLのライバルであるOracleがInnobaseOyを買収するとは思っていませんでした。その後、2008年にSun(Java言語を開発したSun)がMySQL ABを買収し、2009年にSunがOracleに買収されたため、MySQLとInnoDBは別のファミリです。MySQLはますますOracleに似ていると考える人もいますが、それが実際の理由です。

  • メモリ(1ファイル)
    は、重要でないデータをすばやく見つける必要がある環境ですばやくアクセスできるように、すべてのデータをRAMに保存します。このエンジンは、以前はヒープエンジンと呼ばれていました。そのユースケースは減少しています。InnoDBとそのバッファープールメモリ領域は、ほとんどまたはすべてのデータをメモリに格納するための普遍的で耐久性のある方法を提供し、ndbdusterは大規模な分散データセットの高速なキー値ルックアップを提供します。
    特徴:
    データをメモリに入れると、読み取りと書き込みの速度は非常に速くなりますが、データベースを再起動またはクラッシュすると、データはすべて消えます。一時テーブルにのみ適しています。データをテーブルのメモリに保存します。
  • CSV(3ファイル)
    そのテーブルは、実際にはカンマ区切りの値を持つテキストファイルです。csvテーブルを使用すると、CSV形式でデータをインポートまたはダンプして、同じ形式の読み取りと書き込みを行うスクリプトやアプリケーションとデータを交換できます。CSVテーブルにはインデックスがないため、データは通常、通常の操作中にinnodbテーブルに保存され、csvテーブルはインポートまたはエクスポートの段階でのみ使用されます。
    機能:空白行は許可されておらず、インデックスはサポートされていません。形式は普遍的であり、直接編集できるため、異なるデータベース間でのインポートとエクスポートに適しています。
  • アーカイブ(2ファイル)
    これらのコンパクトなインデックスなしのテーブルは、めったに引用されない大量の履歴、アーカイブ、またはセキュリティ監査情報を格納および取得するために使用されます。
    機能:インデックスをサポートせず、更新削除をサポートしません

これらはMySQLのいくつかの一般的なストレージエンジンです。異なるストレージエンジンが異なる機能を提供することを確認しました。それらは異なるストレージメカニズム、インデックス作成方法、ロックレベルおよびその他の機能を持っています。

さまざまなビジネスシナリオでのデータ操作にはさまざまな要件があり、ニーズに合わせてさまざまなストレージエンジンを選択できます。これが、MySQLが非常に多くのストレージエンジンをサポートしている理由です。

2.5.3ストレージエンジンの選び方は?

  • データの整合性に対する要件が高く、トランザクションのサポートが必要な場合は、InnoDBを選択できます。
  • データクエリが多く、更新が少なく、クエリのパフォーマンス要件が高い場合は、MyISAMを選択できます。
  • クエリ用の一時テーブルが必要な場合は、メモリを選択できます。
  • すべてのストレージエンジンがニーズを満たせず、技術的な機能が十分である場合は、公式Webサイトの内部マニュアルに従ってC言語でストレージエンジンを開発できます:
    https//dev.mvsql.com/doc/internals/en/カスタムエンジン。
    この開発仕様によれば、htmlは対応するインターフェースを実装し、アクチュエーターを操作します。

つまり、なぜこれほど多くのストレージエンジンをサポートし、ストレージエンジンをカスタマイズできるのでしょうか。テーブルストレージエンジンを変更しても、サーバーアクセスには影響しません。これは、全員が特定の仕様に従い、同じ操作インターフェイスを提供しているためです。
各ストレージエンジンには独自のサービスがあります。

show engine innodb status;

これらのストレージエンジンは、さまざまな方法でデータファイルを管理し、さまざまな機能を提供しますが、上位層に同じインターフェイスを提供します。

2.6クエリ実行エンジン

ストレージエンジンが分析された後、それは私たちがデータを保存する方法です。では、誰が実行プランを使用してストレージエンジンを操作するのでしょうか。

これは実行エンジンであり、ストレージエンジンによって提供される対応するAPIを使用して操作を完了します。
動作モードを変更せずにテーブルのストレージエンジンを変更するのはなぜですか?異なる機能を持つストレージエンジンによって実装されるAPIは同じだからです。最後に、データがクライアントに返されます。

総括する

一般に、MySQLは3つの層に分割できます。

  • クライアントとインターフェイスする接続レイヤー。
  • 実際に操作を実行するサービス層。
  • ハードウェアを扱うストレージエンジン層。
  1. 接続層
    クライアントがMySQLサーバーのポート3306に接続する場合は、サーバーとの接続を確立する必要があります。次に、すべての接続を管理し、クライアントのIDとアクセス許可を確認します。これらの機能は接続層で完了します。
  2. サービスレイヤー
    接続レイヤーは、SQLステートメントをサービスレイヤーに渡します。サービスレイヤーには、
    クエリキャッシュの判断、SQLに従って対応するインターフェイスの呼び出し、SQLステートメントの字句および文法分析などの一連のプロセスも含まれます。キーワードとして識別方法、エイリアスの識別方法、文法に誤りがあるかどうかなど)。
    次に、オプティマイザがあります。MySQLの最下層は、特定のルール(最小コストの原則)に従ってSQLステートメントを最適化し、最後にそれらをエグゼキュータに渡して実行します。
  3. ストレージエンジン
    ストレージエンジンは、データが実際に保存される場所です。MySQLではさまざまなストレージエンジンがサポートされています。
    次はメモリまたはディスクです。

おすすめ

転載: blog.csdn.net/nonage_bread/article/details/112712668