MySQLを最適化する方法:インデックス、スロークエリ、構成
MySQLは、世界で最も人気のあるリレーショナルデータベースのままですが、非効率的に使用するのが最も簡単なデータベースでもあります。多くの人は、さらなる調査なしでデフォルト設定を使用しています。この記事では、以前に導入されたMySQL最適化手法の一部を確認し、最新の改善と組み合わせます。
コアポイント
-
innodb_buffer_pool_size
、innodb_log_file_size
などの主要なパラメーターを調整してMySQL構成を最適化し、サーバーリソースをよりよく利用し、データベースのパフォーマンスを改善します。innodb_flush_method
インデックスを効率的に使用して、クエリインデックス、プライマリキーインデックス、およびクエリ要件とデータの一意性に基づいてフルテキストインデックスの使用を検討します。 - MySQL用のPercona Toolkitなどのツールを使用して、デュプリケートまたは未使用のインデックスなどの問題を自動的に識別および解決して、データベースの効率を最適化します。
- mysqlのスロークエリログや
- などのツールを使用して、スロークエリを監視および分析してボトルネックを検出し、クエリのパフォーマンスを最適化します。
pt-query-digest
MySQLチューナーとその他のパフォーマンス監視ツールを定期的に実行して、データベース操作に関する洞察を収集し、実際の使用パターンに基づいて構成を微調整します。
設定最適化 MySQLの最初で最も見落とされがちなパフォーマンス改善は、構成を調整することです。バージョン5.7(現在のバージョン)には、以前のバージョンよりも優れたデフォルト値がありますが、改善は引き続き行うことができます。
Linuxベースのホストまたは改良されたホームステッドのようなVagrant Virtual Machineを使用していると仮定しているため、構成ファイルはにあります。インストーラーは補助設定ファイルをロードする可能性があるため、
ファイルがそれほど多くない場合は、ファイルである場合があります。 /etc/mysql/my.cnf
my.cnf
構成を編集/etc/mysql/mysql.conf.d/mysqld.cnf
Vagrant Virtual Machineでローカルに編集した場合、
などの単純なテキストエディターを使用し、
手動調整
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に変数検査官をインストールするには: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
pt-variable-advisor h=localhost,u=homestead,p=secret
<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チューナー
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
./mysqltuner.pl
pt-variable-advisor h=localhost,u=homestead,p=secret
構成を変更するたびに、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>
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
一般的なインデックスは検索を簡素化します。特定の列または列の組み合わせのデータをすばやく見つける必要がある場合に役立ちますが、そのデータは一意である必要はありません。 pt-variable-advisor h=localhost,u=homestead,p=secret
フルテキストインデックスは、フルテキスト検索に使用されます。 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>
wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl
chmod +x mysqltuner.pl
支援ツール: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は、未使用のインデックスを検出することもできます。スロークエリをログに記録する場合(下のボトルネックセクションを参照)、ツールを実行でき、それらのレコードのクエリがクエリに関連するテーブルのインデックスを使用しているかどうかを確認します。
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
pt-variable-advisor h=localhost,u=homestead,p=secret
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>
wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl
chmod +x mysqltuner.pl
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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











PHPでは、Password_hashとpassword_verify関数を使用して安全なパスワードハッシュを実装する必要があり、MD5またはSHA1を使用しないでください。 1)password_hashセキュリティを強化するために、塩値を含むハッシュを生成します。 2)password_verifyハッシュ値を比較して、パスワードを確認し、セキュリティを確保します。 3)MD5とSHA1は脆弱であり、塩の値が不足しており、最新のパスワードセキュリティには適していません。

PHPタイプは、コードの品質と読みやすさを向上させるためのプロンプトがあります。 1)スカラータイプのヒント:php7.0であるため、基本データ型は、int、floatなどの関数パラメーターで指定できます。 3)ユニオンタイプのプロンプト:PHP8.0であるため、関数パラメーターまたは戻り値で複数のタイプを指定することができます。 4)Nullable Typeプロンプト:null値を含めることができ、null値を返す可能性のある機能を処理できます。

PHPは主に手順プログラミングですが、オブジェクト指向プログラミング(OOP)もサポートしています。 Pythonは、OOP、機能、手続き上のプログラミングなど、さまざまなパラダイムをサポートしています。 PHPはWeb開発に適しており、Pythonはデータ分析や機械学習などのさまざまなアプリケーションに適しています。

PHPで前処理ステートメントとPDOを使用すると、SQL注入攻撃を効果的に防ぐことができます。 1)PDOを使用してデータベースに接続し、エラーモードを設定します。 2)準備方法を使用して前処理ステートメントを作成し、プレースホルダーを使用してデータを渡し、メソッドを実行します。 3)結果のクエリを処理し、コードのセキュリティとパフォーマンスを確保します。

PHPとPythonには独自の利点と短所があり、選択はプロジェクトのニーズと個人的な好みに依存します。 1.PHPは、大規模なWebアプリケーションの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンスと機械学習の分野を支配しています。

PHPはMySQLIおよびPDO拡張機能を使用して、データベース操作とサーバー側のロジック処理で対話し、セッション管理などの関数を介してサーバー側のロジックを処理します。 1)MySQLIまたはPDOを使用してデータベースに接続し、SQLクエリを実行します。 2)セッション管理およびその他の機能を通じて、HTTPリクエストとユーザーステータスを処理します。 3)トランザクションを使用して、データベース操作の原子性を確保します。 4)SQLインジェクションを防ぎ、例外処理とデバッグの閉鎖接続を使用します。 5)インデックスとキャッシュを通じてパフォーマンスを最適化し、読みやすいコードを書き、エラー処理を実行します。

PHPは動的なWebサイトを構築するために使用され、そのコア関数には次のものが含まれます。1。データベースに接続することにより、動的コンテンツを生成し、リアルタイムでWebページを生成します。 2。ユーザーのインタラクションを処理し、提出をフォームし、入力を確認し、操作に応答します。 3.セッションとユーザー認証を管理して、パーソナライズされたエクスペリエンスを提供します。 4.パフォーマンスを最適化し、ベストプラクティスに従って、ウェブサイトの効率とセキュリティを改善します。

PHPはWeb開発と迅速なプロトタイピングに適しており、Pythonはデータサイエンスと機械学習に適しています。 1.PHPは、単純な構文と迅速な開発に適した動的なWeb開発に使用されます。 2。Pythonには簡潔な構文があり、複数のフィールドに適しており、強力なライブラリエコシステムがあります。
