まとめ
MySQL は、C および C プログラミング言語で開発されたリレーションシップ データベース管理システムで、David Axmark、Allan Larsson、Michael Widenius によって設立された MySQL AB によって作成されました。最新バージョンは MySQL 9.0.
MySQL は、GNU ライセンスを持つオープン ソース プロジェクトです。
MySQL は、オープンソースであり、フル機能を備え、高いパフォーマンスを備えているため、現在最も人気があり便利なデータベース管理システムです。
建築
クライアント層
- MySQL システム アーキテクチャの最初の層。
- この層の重要なサービスは、接続処理、認証、およびセキュリティです。
- 接続処理: クライアントからの接続を管理します。クライアントが MySQL サーバーに接続したい場合、接続用に新しいスレッドが作成されます。新しい接続が作成されると、サーバーはスレッドをキャッシュします。
- 認証: クライアントがサーバーに接続するときは、接続を確立するための認証情報を提供する必要があります。通常、クライアントはユーザー名とパスワードを使用して認証します。
- セキュリティ: MySQL は、データベースを保護し、認証後にユーザーの権限を確認するための多くの機能を提供します。
サーバー層
- MySQL の次の層は、クエリ ステートメントの処理と多くのユーティリティの提供を担当します。
- 主な機能:
- パーサー: クライアントがクエリ ステートメントをリクエストすると、サーバーはそれを分析してクエリ ツリーを作成し、クエリを書き換えて、クエリ ステートメントの実行に使用する順序とインデックスを定義します。
- オプティマイザー: 実行前にクエリステートメントを最適化します。オプティマイザーはどのエンジンが使用されているかを気にしませんが、ストレージ エンジンは特定のクエリの最適化に影響を与える可能性があります。
- クエリ キャッシュ: クエリ キャッシュには、クエリ ステートメントの結果が保存されます。クライアントが同じクエリを再度リクエストすると、サーバーは解析と最適化の手順をバイパスして、キャッシュされた結果を返します。この機能はボトルネックの問題のため、バージョン 8.0 以降では非推奨になりました。
- サービスとユーティリティ:
- バックアップと復元
- セキュリティ: プロバイダー ユーザーと権限システム
- レプリケーション: これは、メイン サーバーから多くの子サーバーにデータをコピーして同期するプロセスです。
- クラスタ
- パーティショニング: 特定のロジックを使用してテーブルを多くの部分に分割します。
- ワークベンチ: MySQL と対話して利用するために設計されたビジュアル ツールです。
ストレージ層
- これは、データベースにデータを保存する方法に対する責任の層です。
- デフォルトでは、MySQL は InnoDB ストレージ エンジンを使用します。
- MySQL はさまざまなストレージ エンジンをサポートしています。
- InnoDB (デフォルト)
- マイサム
- メモリ
- CSV
- アーカイブ
- ブラックホール
- マージ
- 連邦
MySQL のパフォーマンスを最適化する
SQL文の最適化
ステートメントの説明を説明します
explain sql_statememnt
explain analyze sql_statement
インデックス作成手法
- クエリと検索時のパフォーマンスが向上します。
- 複数の列のインデックスを作成する場合、最初の列が非常に重要です。これにより、クエリ ステートメントのパフォーマンスが決まります。たとえば、(名前, 誕生日) にインデックスを作成した場合、「名前」列を使用するクエリはこのインデックスを使用しますが、「誕生日」列を使用するクエリは使用しません。
- 新しいインデックスを作成するための構文:
create index idx_birthday on customers(birthday);
- このコマンドは、指定されたインデックスをクエリ オプティマイザーにアクセスできないようにするため、クエリ実行プランの対象として考慮されなくなります。
alter table customers alter index idx_birthday invisible;
パーティション
- データベースのサイズが 2GB を超える (または 1,000 万レコードを超える) 場合は、そのデータベースにパーティショニングを使用する必要があります。
- パーティショニングを使用すると、パフォーマンスが向上します。
- パーティション プランは、WHERE 句で頻繁に使用される列に基づいている必要があります。
データベースパラメータの最適化
バッファキャッシュヒット
- これは、システムが物理ストレージからではなくバッファ キャッシュからロードするデータの割合です。
- パーセンテージが 90% 未満の場合は、最適化する必要があります。
- 2 つのパラメータに依存します:
-
Innodb_buffer_pool_read_requests: バッファ プールに送信されたリクエストの合計。コマンド: '%Innodb_buffer_pool_read_requests% のようなグローバル ステータスを表示します。
-
Innodb_buffer_pool_reads: メモリ内のバッファ プールに見つからないリクエストの合計は、ディスクから読み取る必要があります。コマンド: '%Innodb_buffer_pool_reads% のようなグローバル ステータスを表示
- 計算式:
(Innodb_buffer_pool_read_requestss - Innodb_buffer_pool_reads) x100 / Innodb_buffer_pool_read_requests
テーブルキャッシュヒット
- MySQL はテーブルをキャッシュしてメモリ内で高速にクエリします。
- パーセンテージが 80% より低い場合は、最適化する必要があります。
- 2 つのパラメータに依存します:
-
Open_tables: キャッシュ内でオープンされているテーブルの合計数。コマンド: 「Open_tables」のようなグローバルステータスを表示
-
Opened_tables: オープンされているテーブルの合計。コマンド: 「Opened_tables」のようなグローバルステータスを表示
- 計算式: Open_tables/Opened_tables
テーブル定義キャッシュ ヒット
- クエリを実行するとき、MySQL はテーブルの名前、列数、行数などのテーブルに関する情報を必要とします。この情報はテーブル定義と呼ばれます。
- パーセンテージが 80% より低い場合は、最適化する必要があります。
- 2 つのパラメータに依存します:
-
Open_table_settings: 定義テーブルの合計がキャッシュにあります。コマンド: 'Open_table_settings' のようなグローバル ステータスを表示します。
-
Opened_tables: 定義テーブルの合計が要求されます。コマンド: 「Opened_tables」のようなグローバルステータスを表示
- 計算式: オープンテーブル定義数/オープンテーブル定義数
メモリ内の一時テーブル
- Order、Group By などの多くの SQL ステートメントは一時テーブルを使用する必要があります。
- パーセンテージが 80% より低い場合は、最適化する必要があります。
- 2 つのパラメータに依存します:
-
Created_tmp_disk_tables: 合計一時テーブルがディスク上に作成されます。コマンド: '%Created_tmp_disk_tables% のようなグローバル ステータスを表示
-
Created_tmp_tables: 一時テーブルの合計数が作成されます。コマンド: '%Created_tmp_tables% のようなグローバル ステータスを表示
- 計算式: (Created_tmp_tables - Created_tmp_disk_tables)/ Created_tmp_tables
結論
このブログでは、MySQL に関する研究に基づいた知識を提供します。 MySQL は、低コスト、広範なユーティリティ、高性能で知られるリレーショナル データベース管理システムであり、幅広いプロジェクトに適しています。このブログでは MySQL の多くの機能と側面を取り上げていますが、探索すべき点はさらにあります。今後のブログで追加の機能や知識についてさらに詳しく掘り下げていきます。
読んでいただきありがとうございます。また次のブログでお会いしましょう。
参考資料
- MySQL ドキュメント
- MySQL コース - トラン コック ホイ
- ウィキペディア - MySQL