遭遇#
皆さんはまず自分のタスクマネージャーを呼び出すことができます(私は Windows です、ショートカットキーは CTRL + SHIFT + ESC です)--> 最初のタブの最初のものがプロセスです。
プロセスとは何ですか?#
プロセスはリソースの割り当ての基本単位であり、オペレーティングシステムの実行単位です。私たちのコンピュータには多くのプログラムがあります。例えば、WeChat、QQ、NetEase Cloud Music など、実行中の各プログラムはプロセスと呼ばれます。各プロセスには独自のメモリスペース、コード、データがあります。各プロセスには固有のプロセス ID があります。皆さんのコンピュータで MySQL サービスを開始している場合、プロセス内で MySQL のプロセス ID を見つけることができます --->mysqld。以下の図のように。
(私は 2 つ持っています。それは私が 2 つのバージョンの MySQL、5.7 と 8.0 をインストールしているためです)
MySQL に接続する#
win+r を押して「cmd」と入力してコマンドプロンプトを開きます。次のコマンドを入力します:
mysql -hlocalhost -u root -p
-hlocalhost は、自分のコンピュータ上であれば省略することもできます。-u の後にはスペースがあっても構いませんが、-p の後にはスペースを入れることはできません。上記のコマンドはパスワードを暗黙的に入力し、他の人に見られることはありません。Enter キーを押した後、パスワードを入力してください。
プロセス間通信の方法は?#
私は面白い言葉で表現してみますが、もっと正式なものを見たい場合は以下をご覧ください。
-
パイプ(Pipe):2 つのプロセスがストローを使って秘密の情報を伝えると想像してください。パイプは一方向のみで、データは一方からもう一方に流れるだけで、まるでストローの中のジュースのようです。
-
名前付きパイプ(Named Pipe):これはパイプのアップグレード版で、名前がついています!これにより、異なるプロセスはこの名前を使用して互いを見つけ、双方向通信を行うことができます。まるで 2 人がトランシーバーを使って会話しているようです。
-
シグナル(Signal):プロセス間の手拍子ゲームです。1 つのプロセスが別のプロセスにシグナルを送信し、何が起こったかを伝えます。まるで手をたたいて「あなたが見つかりました」と伝えるようなものです。
-
メッセージキュー(Message Queue):プロセス間の郵便局です。プロセスはメッセージをキューに入れ、別のプロセスがキューからメッセージを取り出します。まるで手紙を送るようなものですが、この郵便局の効率は非常に高いです。
-
共有メモリ(Shared Memory):プロセス間で共有するメモリ領域です。まるで共有の黒板のように、みんなが上に文字を書いたり消したりできます。この方法は非常に高速ですが、書くときの混乱に注意する必要があります。
-
ソケット(Socket):プロセス間の電話です。ソケットを使用すると、異なるプロセス、さらには異なるコンピュータ間で通信することができます。まるで電話をかけるようなものです。相手の電話番号(IP アドレスとポート番号)さえわかれば、通話を開始できます。
パイプ(pipe): パイプは半二重の通信方法であり、データは一方向にのみ流れ、関係のあるプロセス間でのみ使用できます。プロセスの関係は通常、親子プロセスの関係を指します。
名前付きパイプ(FIFO): 名前付きパイプも半二重の通信方法ですが、名前が付いています!これにより、関係のないプロセス間での通信が可能になります。
メッセージキュー(Message Queue): メッセージキューは、メッセージのリンクリストであり、カーネルに格納され、メッセージキュー識別子で識別されます。メッセージキューは、信号の伝達量が少ない、パイプがフォーマットのないバイトストリームしか運べない、バッファサイズが制限されるなどの欠点を克服しています。
共有メモリ(Shared Memory): 共有メモリは、他のプロセスからアクセスできるメモリ領域をマッピングするものであり、1 つのプロセスによって作成されますが、複数のプロセスがアクセスできます。共有メモリは、他のプロセス間通信の方法の効率が低いために専門に設計されたもので、セマフォなどの他の通信メカニズムと組み合わせて使用され、プロセス間の同期と通信を実現します。
ソケット(Socket): ソケットは、他の通信メカニズムとは異なり、異なるプロセス間の通信に使用されます。
シグナル(Signal): シグナルは、比較的複雑な通信方法であり、受信プロセスに何が起こったかを通知するために使用されます。
MySQL はどのようなプロセス間通信方法をサポートしていますか?#
- 名前付きパイプと共有メモリ
- Unix ドメインソケットファイル
- TCP/IP:IP アドレス + ポート番号を使用して通信を行います。本質的には「ソケット(Socket)」通信に属します。
プロセスとポート番号は異なる概念であり、ポート番号は特定のプロセスを識別するための数字です。つまり、すべてのプロセスにポート番号があるわけではなく、通信が必要なプロセスのみがポート番号を使用します。ポート番号は事前に割り当てることができます。たとえば、HTTP 通信の 80 番ポートや HTTPS の 443 番ポートなどです。MySQL サービスが起動すると、デフォルトで 3306 番ポートが割り当てられます。
MySQL のストレージエンジン#
ここでは、ストレージエンジンについて話しましょう。データはすべてストレージエンジンに格納されています。ここでは、2 つの一般的なストレージエンジンであるInnoDBとMyISAMについて話します。
InnoDB:
- トランザクションのサポート:InnoDB はコミット(commit)とロールバック(rollback)の機能を提供し、データの完全性と一貫性を保証します。
- 行レベルのロック:並行処理時に、InnoDB は変更された単一の行データをロックすることができ、並行性能を向上させます。
- 外部キーのサポート:InnoDB は参照整合性制約をサポートし、データベースの関係整合性の維持に役立ちます。
- MVCC(Multi-Version Concurrency Control)のサポート:これにより、高並行性の環境での読み取り性能が向上します。
MyISAM:
- トランザクションの非サポート:MyISAM はトランザクションのサポートを提供せず、トランザクション処理が必要な場面では適していません。
- テーブルレベルのロック:MyISAM は書き込み操作時にテーブル全体をロックするため、並行性能が低下する可能性があります。
- 外部キーの非サポート:MyISAM は参照整合性制約をサポートしません。
- より小さなストレージスペース:MyISAM は通常、より少ないディスクスペースを使用します。なぜなら、トランザクションや行レベルのロックに関連する情報を保存する必要がないからです。
InnoDB と MyISAM の違い:
共通点:
- どちらも MySQL のストレージエンジンであり、データの格納と管理に使用されます。
違い:
- トランザクションのサポート:InnoDB はトランザクションをサポートしていますが、MyISAM はサポートしていません。
- ロックメカニズム:InnoDB は行レベルのロックを使用し、MyISAM はテーブルレベルのロックを使用します。
- 外部キーのサポート:InnoDB は外部キーをサポートしますが、MyISAM はサポートしません。
- ストレージスペース:InnoDB は通常、より多くのディスクスペースを使用しますが、MyISAM はより少ないスペースを使用します。
- 並行性能:InnoDB は高並行性の環境で通常より優れたパフォーマンスを発揮します。これは、行レベルのロックと MVCC のサポートによるものです。
異なるシナリオに応じて、異なるストレージエンジンを選択します。トランザクションのサポートと高並行性のパフォーマンスが必要な場合は、InnoDB を使用すると良いでしょう。トランザクションのサポートが不要で、ストレージスペースの要件が高い場合は、MyISAM を検討することができます。
最後に、1 つの違いについて話したいと思います:
InnoDB では、データはインデックスであり、インデックスはデータですが、MyISAM では、インデックスはインデックスであり、データはデータです。
少し説明します:
-
InnoDB では、「データはインデックスであり、インデックスはデータ」です。InnoDB はクラスタ化インデックスを使用してデータを格納します。クラスタ化インデックスでは、データ行と主キーインデックスが密接に結びついており、主キーの順序で格納されます。これは、データとインデックスが実際には一体であることを意味します。データをクエリする場合、主キーインデックスを使用して直接対応するデータ行を見つけることができます。追加のデータ検索プロセスは必要ありません。
-
MyISAM では、「インデックスはインデックスであり、データはデータ」です。MyISAM は非クラスタ化インデックスを使用してデータを格納します。非クラスタ化インデックスでは、データ行とインデックスが別々に格納されます。インデックスにはインデックスキーと実際のデータ行へのポインタが含まれます。データをクエリする場合、まずインデックスを検索し、その後、ポインタを使用して実際のデータを取得する必要があります。このプロセスは「リバースルックアップ」と呼ばれます。
まとめると、InnoDB ではデータとインデックスが密接に結びついており、クエリ時には追加のデータ検索プロセスが必要ありません。一方、MyISAM ではデータとインデックスが別々に格納され、クエリ時にはインデックスを検索し、その後データを取得する必要があります。これが「InnoDB ではデータはインデックスであり、インデックスはデータ;MyISAM では、インデックスはインデックスであり、データはデータ」という意味です。