ホームページ >バックエンド開発 >PHPチュートリアル >MySQLを最適化する方法:インデックス、スロークエリ、構成
MySQLは、世界で最も人気のあるリレーショナルデータベースのままですが、非効率的に使用するのが最も簡単なデータベースでもあります。多くの人は、さらなる調査なしでデフォルト設定を使用しています。この記事では、以前に導入されたMySQL最適化手法の一部を確認し、最新の改善と組み合わせます。
コアポイント
innodb_buffer_pool_size
、innodb_log_file_size
などの主要なパラメーターを調整してMySQL構成を最適化し、サーバーリソースをよりよく利用し、データベースのパフォーマンスを改善します。 innodb_flush_method
pt-query-digest
設定最適化 MySQLの最初で最も見落とされがちなパフォーマンス改善は、構成を調整することです。バージョン5.7(現在のバージョン)には、以前のバージョンよりも優れたデフォルト値がありますが、改善は引き続き行うことができます。
Linuxベースのホストまたは改良されたホームステッドのようなVagrant Virtual Machineを使用していると仮定しているため、構成ファイルはにあります。インストーラーは補助設定ファイルをロードする可能性があるため、
ファイルがそれほど多くない場合は、ファイルである場合があります。 /etc/mysql/my.cnf
my.cnf
構成を編集/etc/mysql/mysql.conf.d/mysqld.cnf
などの単純なテキストエディターを使用し、
手動調整
Perconaの別のツールがあり、残りの問題を自動的に見つけるのに役立ちます。上記の手動調整なしで実行すると、他の3つがアプリケーションの環境に依存するため、4つの修正のうち1つだけが手動で識別できることに注意してください。
これらはどれも重要な問題ではなく、修正する必要はありません。追加できる唯一のことは、複製とスナップショットのバイナリロギングです。 注:新しいバージョンでは、ビンログのサイズはデフォルトで1Gになり、PTはそれに気付きません。 ご覧のとおり、新しいMySQLには合理的なデフォルト値があり、物事がほぼすぐに生産されるようになります。もちろん、各アプリは異なり、適用される追加のカスタム調整があります。 チューナーは、長い間隔でデータベースを監視し(ライブアプリケーションで週に1回実行)、ログに表示されるものに基づいて変更を提案します。 ダウンロードしてインストールするだけです: で実行すると、データベースの管理者のユーザー名とパスワードに依頼し、クイックスキャンを出力します。たとえば、ここに私のinnodbセクションがあります:
index
注:キーとインデックスという用語は同じ意味で使用できます。
数行しか含まれていないテーブルは、実際にはインデックス作成の恩恵を受けません。ご想像のとおり、5ページを検索すると、最初にインデックスを付け、ページ番号を取得してから特定のページを開くことほど遅くはありません。 では、どのインデックスを追加するインデックスとどのような種類のインデックスが存在するかをどのように見つけますか? プライマリキーインデックスはデータのインデックスであり、データに対処するデフォルトの方法です。ユーザーアカウントの場合、これはユーザーIDまたはユーザー名、またはプライマリメールである場合があります。プライマリキーインデックスは一意です。唯一のインデックスは、一連のデータで繰り返すことができないインデックスです。 ユーザーが特定のユーザー名を選択した場合、他の誰もそれを使用できないはずです。ユーザー名列に「一意の」インデックスを追加すると、この問題が解決します。他の誰かが既存のユーザー名で行を挿入しようとする場合、MySQLはエラーを報告します。 プライマリキー/インデックスは通常、テーブル作成時に定義され、テーブルを変更することで唯一のインデックスが定義されます。 プライマリキーと一意のキーの両方を1つ以上の列に作成できます。たとえば、定義する国ごとに1つのユーザー名があることを確認する場合は、次のような両方の列に一意のインデックスを作成できます。
アシストツール:説明
テーブルにインストールされているデフォルトのWordPressには、重複したインデックスがあります。
支援ツール:Perconaは、未使用のインデックスを検出するために使用されます
このツールの詳細な使用については、こちらをご覧ください。 ボトルネック
このセクションでは、データベース内のボトルネックを検出および監視する方法について説明します。
ツールを使用してインデックス使用量を分析できます。これにより、次の結果が生成されます。
これらのログを手動で分析したい場合は、これを行うこともできますが、まずログをより「分析された」形式にエクスポートする必要があります。これは次のとおりです
他のパラメーターのドキュメントを参照してください。 結論 この包括的なMySQL Optimization Articleでは、MySQLをより速く実行するさまざまな方法を検討します。 構成最適化を処理し、インデックスを完了し、いくつかのボトルネックを取り除きました。ただし、これはほとんど理論的です。実際のユースケースがこれらのテクノロジーを実際のアプリケーションに適用するためには、今後のパフォーマンスブーストプロジェクトに注意してください。
テクニックやトリックを見逃しましたか?教えてください! クエリ最適化におけるMySQLインデックスの重要性は何ですか? MySQLインデックスは、データの取得を大幅に高速化できるため、クエリの最適化に重要です。本のインデックスと同様に機能し、テーブル内のすべての行をスキャンせずにデータベースを見つけて取得できるようにします。これにより、特に大規模なデータベースでは、クエリの実行が速くなります。ただし、インデックスは読み取り速度を上げるが、データを挿入または更新するときにインデックスを更新する必要があるため、書き込み速度を遅くする可能性があることに注意することが重要です。 MySQLは、スロークエリログと呼ばれる便利なツールを提供します。このツールは、指定された時間を超えて実行されたすべてのSQLクエリに関する情報を記録します。 MySQL構成ファイルで有効にして、クエリがスロークエリと見なされる前に、
cp /etc/mysql/my.cnf /home/vagrant/Code
vim
注:上記のパスを変更して、構成ファイルの実際の場所に一致するように - 実際にはsudo vim /etc/mysql/my.cnf
/etc/mysql/mysql.conf.d/mysqld.cnf
次の手動調整をすぐに行う必要があります。これらのヒントに基づいて、セクションの構成ファイルに次のものを追加します:<code>innodb_buffer_pool_size = 1G # (在此处调整值,总 RAM 的 50%-70%)
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 1 # 可以更改为 2 或 0
innodb_flush_method = O_DIRECT</code>
innodb_buffer_pool_size
- バッファープールは、メモリ内のデータとインデックスのキャッシュに使用されるストレージエリアです。頻繁にアクセスされるデータをメモリに保持するために使用され、専用サーバーまたは仮想サーバーを実行すると、アプリケーションのこの部分に最も多くのRAMを割り当てることが理にかなっており、データベースはしばしばボトルネックです。したがって、すべてのRAMの50〜70%をそれに割り当てます。バッファープールのサイズ変更ガイドは、MySQLドキュメントに記載されています。 innodb_flush_log_at_trx_commit
ここには説明があります。これは、ログファイルに何が起こるかを示します。 1では、各トランザクションの後にログがディスクにフラッシュされるため、最も安全なセットアップがあります。 0または2を使用すると、酸性のパフォーマンスが低くなりますが、パフォーマンスが高くなります。この場合、違いはセット1の安定性の利点を超えるのに十分ではありません。 innodb_flush_method
- リフレッシュ作業を完了するには、ダブルバッファリングを避けるためにO_DIRECT
に設定します。これは、I/Oシステムのパフォーマンスが非常に低い場合を除き、常に実行する必要があります。 DigitalOcean Dropletsなどのほとんどのマネージャーサーバーでは、SSDがあるため、I/Oシステムのパフォーマンスが高くなります。 変数検査官
Ubuntuに変数検査官をインストールするには:<code class="language-bash">wget https://repo.percona.com/apt/percona-release_0.1-4.$(lsb_release -sc)_all.deb
sudo dpkg -i percona-release_0.1-4.$(lsb_release -sc)_all.deb
sudo apt-get update
sudo apt-get install percona-toolkit</code>
他のシステムの場合は、指示に従ってください。 <code class="language-bash">pt-variable-advisor h=localhost,u=homestead,p=secret</code>
<code># WARN delay_key_write: MyISAM index blocks are never flushed until necessary.
# NOTE max_binlog_size: The max_binlog_size is smaller than the default of 1GB.
# NOTE sort_buffer_size-1: The sort_buffer_size variable should generally be left at its default unless an expert determines it is necessary to change it.
# NOTE innodb_data_file_path: Auto-extending InnoDB files can consume a lot of disk space that is very difficult to reclaim later.
# WARN log_bin: Binary logging is disabled, so point-in-time recovery and replication are not possible.</code>
<code>innodb_buffer_pool_size = 1G # (在此处调整值,总 RAM 的 50%-70%)
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 1 # 可以更改为 2 或 0
innodb_flush_method = O_DIRECT</code>
バイナリログのサイズを決定するように設定
max_binlog_size
。これらのログは、トランザクションとクエリを記録し、チェックポイントを作成します。トランザクションが最大値よりも大きい場合、ディスクに保存するとログが最大値より大きくなる可能性があります。なかに、MySQLはこの制限内に保持されます。 log_bin
オプションは、バイナリロギングを完全に有効にします。それがなければ、スナップショットやコピーはありません。これにより、ディスクスペースに大きな圧力がかかる可能性があることに注意してください。サーバーIDは、バイナリロギングのためにアクティブ化されるときに必要なオプションであるため、ログは(複製用)からどのサーバーから来るかを把握し、形式はログに書き込む方法にすぎません。 mysqlチューナー
<code class="language-bash">wget https://repo.percona.com/apt/percona-release_0.1-4.$(lsb_release -sc)_all.deb
sudo dpkg -i percona-release_0.1-4.$(lsb_release -sc)_all.deb
sudo apt-get update
sudo apt-get install percona-toolkit</code>
./mysqltuner.pl
<code class="language-bash">pt-variable-advisor h=localhost,u=homestead,p=secret</code>
繰り返しますが、このツールはサーバーが実行されてから1週間に1回実行する必要があることに注意することが重要です。構成値を変更し、サーバーを再起動した後、それから1週間実行する必要があります。 Cronの仕事を設定して、これを行い、定期的に結果を送信するのが最善です。
構成を変更するたびに、mysqlサーバーを再起動してください:<code># WARN delay_key_write: MyISAM index blocks are never flushed until necessary.
# NOTE max_binlog_size: The max_binlog_size is smaller than the default of 1GB.
# NOTE sort_buffer_size-1: The sort_buffer_size variable should generally be left at its default unless an expert determines it is necessary to change it.
# NOTE innodb_data_file_path: Auto-extending InnoDB files can consume a lot of disk space that is very difficult to reclaim later.
# WARN log_bin: Binary logging is disabled, so point-in-time recovery and replication are not possible.</code>
一意/プライマリキーインデックス
<code>innodb_buffer_pool_size = 1G # (在此处调整值,总 RAM 的 50%-70%)
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 1 # 可以更改为 2 或 0
innodb_flush_method = O_DIRECT</code>
<code class="language-bash">wget https://repo.percona.com/apt/percona-release_0.1-4.$(lsb_release -sc)_all.deb
sudo dpkg -i percona-release_0.1-4.$(lsb_release -sc)_all.deb
sudo apt-get update
sudo apt-get install percona-toolkit</code>
頻繁にアクセスできる列に一意のインデックスが追加されます。したがって、ユーザーアカウントを頻繁にリクエストし、データベースに多くのユーザーアカウントがある場合、これは良いユースケースです。
一般的なインデックスは検索を簡素化します。特定の列または列の組み合わせのデータをすばやく見つける必要がある場合に役立ちますが、そのデータは一意である必要はありません。 <code class="language-bash">pt-variable-advisor h=localhost,u=homestead,p=secret</code>
上記の操作により、国ごとのユーザー名の検索がスピードアップされます。
フルテキストインデックスは、フルテキスト検索に使用されます。 InnoDBおよびMyisamストレージエンジンのみがフルテキストインデックスをサポートし、CHAR、VARCHAR、およびテキスト列のみがサポートされています。
は特別なタイプではなく、変更です。バージョン8.0から始めて、MySQLは下降インデックス作成をサポートしています。つまり、インデックスを降順で保存できます。これは、最初に最後に追加されたデータを取得する必要があることが多い大きなテーブルまたは優先度エントリがある場合に役立ちます。いつでも降順でソートすることができますが、これによりパフォーマンスが少しもなります。これにより、さらにスピードが上がります。 <code># WARN delay_key_write: MyISAM index blocks are never flushed until necessary.
# NOTE max_binlog_size: The max_binlog_size is smaller than the default of 1GB.
# NOTE sort_buffer_size-1: The sort_buffer_size variable should generally be left at its default unless an expert determines it is necessary to change it.
# NOTE innodb_data_file_path: Auto-extending InnoDB files can consume a lot of disk space that is very difficult to reclaim later.
# WARN log_bin: Binary logging is disabled, so point-in-time recovery and replication are not possible.</code>
最適化クエリを表示すると、説明ツールは貴重です。簡単なクエリの前に説明を追加すると、非常に深い方法でそれを処理し、使用されているインデックスを分析し、ヒットとミスの比率を示します。探している結果を得るために処理する行の数に気付くでしょう。
<code>max_binlog_size = 1G
log_bin = /var/log/mysql/mysql-bin.log
server-id=master-01
binlog-format = 'ROW'</code>
を使用してさらに拡張できます
<code class="language-bash">wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl
chmod +x mysqltuner.pl</code>
支援ツール:Perconaは、重複インデックスを検出するために使用されます
以前にインストールされていたPercona Toolkitは、サードパーティCMSを使用するときに役立つ重複インデックスを検出するか、必要以上に予期せずに追加されているインデックスが追加されているかどうかを確認するためのツールを提供します。たとえば、wp_posts
<code>innodb_buffer_pool_size = 1G # (在此处调整值,总 RAM 的 50%-70%)
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 1 # 可以更改为 2 或 0
innodb_flush_method = O_DIRECT</code>
Perconaは、未使用のインデックスを検出することもできます。スロークエリをログに記録する場合(下のボトルネックセクションを参照)、ツールを実行でき、それらのレコードのクエリがクエリに関連するテーブルのインデックスを使用しているかどうかを確認します。
<code class="language-bash">wget https://repo.percona.com/apt/percona-release_0.1-4.$(lsb_release -sc)_all.deb
sudo dpkg -i percona-release_0.1-4.$(lsb_release -sc)_all.deb
sudo apt-get update
sudo apt-get install percona-toolkit</code>
<code class="language-bash">pt-variable-advisor h=localhost,u=homestead,p=secret</code>
ツールまたはpt-index-usage
pt-query-digest
その他のパラメーターは、データをさらにフィルタリングし、重要なコンテンツのみがエクスポートされることを確認できます。たとえば、平均実行時間でソートされた上位10のクエリ。 <code># WARN delay_key_write: MyISAM index blocks are never flushed until necessary.
# NOTE max_binlog_size: The max_binlog_size is smaller than the default of 1GB.
# NOTE sort_buffer_size-1: The sort_buffer_size variable should generally be left at its default unless an expert determines it is necessary to change it.
# NOTE innodb_data_file_path: Auto-extending InnoDB files can consume a lot of disk space that is very difficult to reclaim later.
# WARN log_bin: Binary logging is disabled, so point-in-time recovery and replication are not possible.</code>
<code>max_binlog_size = 1G
log_bin = /var/log/mysql/mysql-bin.log
server-id=master-01
binlog-format = 'ROW'</code>
<code class="language-bash">wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl
chmod +x mysqltuner.pl</code>
mysqlでスロークエリを識別する方法は?
long_query_time
MySQLは、Bツリー、ハッシュ、Rツリー、フルテキストインデックスなど、複数のタイプのインデックスをサポートしています。 Bツリーはデフォルトのインデックスタイプであり、さまざまなクエリに適しています。ハッシュインデックスは等しい比較に使用され、そのようなクエリのBツリーよりも高速です。 Rツリーインデックスは空間データ型に使用され、フルテキストインデックスはフルテキスト検索に使用されます。
MySQL構成最適化には、パフォーマンスのためにさまざまなサーバー変数を調整することが含まれます。これには、バッファープールのサイズ、ログファイルサイズ、クエリキャッシュサイズなどの調整が含まれます。サーバーのパフォーマンスを定期的に監視し、必要に応じてこれらの変数を調整することが重要です。
MySQLクエリとインデックスの最適化に利用できるツールがいくつかあります。これらのツールには、MySQLがクエリの実行方法に関する情報を提供するMySQLの組み込み説明ステートメント、およびPercona ToolkitやMySQL Workbenchなどのサードパーティツールが含まれます。
MySQLの説明声明は、MySQLがクエリをどのように実行するかについての情報を提供します。これには、アクセスされたテーブル、テーブルにアクセスされる順序、使用される特定のインデックス、および読み取り行数の推定に関する情報が含まれます。この情報は、潜在的なパフォーマンスの問題を特定し、インデックスの最適化をガイドするのに役立ちます。
インデックスは、データの取得をスピードアップすることで読み取り操作を大幅に改善しますが、書き込み操作が遅くなる可能性があります。これは、データが挿入または更新されるたびに、対応するインデックスを更新する必要があるためです。したがって、インデックスを作成するときは、読み取り操作と書き込み操作のバランスをとることが重要です。
インデックスは、MySQLでの参加オペレーションのパフォーマンスを大幅に改善できます。結合条件で使用される列にインデックスを作成することにより、MySQLは接続されたテーブルで一致する行をすばやく見つけることができます。これにより、フルテキストスキャンの必要性が減り、クエリの実行が速くなります。
MySQLのクエリキャッシュは、選択クエリの結果とクエリ自体を保存します。同じクエリが受信されると、MySQLはクエリを再度実行する代わりに、キャッシュから結果を取得できます。これにより、特に複雑なクエリや頻繁に実行されるクエリの場合、パフォーマンスが大幅に向上します。
MySQLは、サーバーのパフォーマンスを監視するためのいくつかのツールを提供します。これらのツールには、パフォーマンスパターン(詳細なパフォーマンスメトリックの提供)と情報パターン(データベースメタデータに関する情報の提供)が含まれます。さらに、Show Statusコマンドを使用して、サーバーの実行ステータスに関する情報を取得できます。
以上がMySQLを最適化する方法:インデックス、スロークエリ、構成の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。