ホームページ >データベース >mysql チュートリアル >MySQL のパフォーマンスを最適化するにはどうすればよいですか?最適化のヒントの共有
データベースのパフォーマンスの最適化に関して最も重要なことは、正しいものを選択することです。アプリケーションにリレーショナル データベースが必要か、非リレーショナル データベースが必要かを決定する必要があります。 1 つのジャンル内でも、複数の選択肢があります。リレーショナル データベースだけでなく、Oracle、MySQL、SQL Server、PostgreSQL などもあります。一方、非リレーショナル データベースには、MongoDB、Cassandra、CouchDB が導入されました。
読み取り/書き込みパフォーマンスを高速化するには、非リレーショナル データベースを使用することを提案してください。ただし、いくつかの改善と調整を行うことで、リレーショナル データベースを既知の制限を超えることができます。そこでこの記事では、MySQL データベースを高速化するためのヒントをいくつか紹介します。
なぜ MySQL を使用する必要があるのか具体的に疑問に思っている場合、答えは簡単です。MySQL は無料でオープンソースであり、PHP コミュニティで非常に人気があるのに対し、Oracle は価格が高いため広く使用されていないからです。他のオプションは MySQL ほど人気がありません。
- MySQL サーバー構成: \
まず、オペレーティング システムに応じて、構成ファイルの場所を知る必要があります。 Linux システムでは、「/etc/mysql/my.cnf」にあります。 \
今度は、エンジン InnoDB と MyISAM を選択します。選択を容易にするために、InnoDB は「行レベルのロック、外部キー、トランザクション」をサポートしているため、MySQL 5.5 のデフォルト エンジンになった一方、MyISAM は前述の機能をサポートしていないため、次のような場合にはほとんど役に立たないことを知っておく必要があります。最新のアプリケーション プログラム。 \
正しいエンジンを選択したら、my.cnf ファイルにいくつかの構成変数を設定します。
max_connection 変数: \
max_connection 変数は、アプリケーションによって許可される接続の数を表します。デフォルト値は 151 接続ですが、「MySQL エラー、接続が多すぎます...」というエラー メッセージが表示された場合は、この数を簡単に増やすことができます\
最大连接数 = 170
innodb_buffer_pool_size 変数: \
処理を高速化するために、MySQL はサーバーのメモリにデータをキャッシュします。この変数は MySQL に使用できるギガバイト数を伝えます。この変数は、データベースに大きな BLOB を保存する場合に役立ちます。これをサーバーのメモリの 80 ~ 90% に設定できます。したがって、サーバーに 16 GB のメモリがある場合は、14 GB に設定できます。
innodb_buffer_pool_size = 14GB
innodb_io_capacity 変数: \
この変数は、MySQL が使用できる入出力操作の数を伝えます。これはディスクによって異なります。たとえば、単一の 7200 RPM ドライブは 200 I/O に制限されますが、エンタープライズ SSD ディスクは 50,000 I/O に制限されます。オペレーティング システムのコマンド ラインから入出力値を簡単に見つけて、変数を利用可能な I/O の 90% に設定できるため、MySQL が過剰な I/O 操作を使用することはありません。
innodb_io_capacity = 21000
query_cache_limit 変数と query_cache_size 変数:\
MySQL はメモリ内のデータのキャッシュもサポートしていますが、プログラムがリクエストするたびにキャッシュ システムとして依存することはできません。データがデータベース テーブルに書き込まれると、MySQL はテーブル全体のクエリ キャッシュを再構築します。したがって、プログラムの負荷が高い場合、MySQL キャッシュはまったく役に立たなくなります。この場合、両方の変数を 0 に設定して MySQL キャッシュのオーバーヘッドを節約することをお勧めします。代わりに、Redis などを使用してキャッシュを管理できます。 。
query_cache_limit = 0 query_cache_size = 0
スロー クエリ ログ:\
スロー クエリ ログには、どのクエリが定義したしきい値を超えているかが表示されるため、どのクエリが遅いかを推測する必要がなくなります。 。 \
まず、構成ファイルで slow_query_log
を有効にする必要があります。 Linux サーバーで、「/etc/mysql/my.cnf」またはシステム上の同等のファイルを開きます。 \
さらに次を追加します:
slow_query_log = 1 long_query_time = 1
これらの 2 つのオプションにより、低速クエリ ログが有効になり、1 秒以上かかるクエリがログに記録されます。ファイルではなくテーブルでログを表示したい場合は、次のように追加します。
log_output = 'TABLE'
これにより、「slow_log」テーブルでログを見つけることができます。ここでは、1 秒以上実行されたすべての低速クエリに関する情報を確認できます。この情報には、クエリによって影響を受けた正確な実行時間と行数、およびクエリを実行したユーザーが含まれます。
クエリの最適化\
遅いクエリをすべて取得したら、クエリを最適化して高速化する方法が必要です。したがって、クエリ ステートメントの前に「explain」キーワードを追加すると、関連するクエリに関する詳細情報を取得できます。例: explain select * from users where active=1;
「説明」キーワードは、クエリがヒットするインデックスと、データを取得するためにクエリする行数を定義するのに役立ちます。この情報により、さらにインデックスを作成する必要があるか、データベース テーブルを再構築する必要があるかがわかります。
非正規化と制約: \
非正規化は、冗長データを追加するかグループ化することによって読み取りパフォーマンスを向上させるプロセスです。たとえば、「Products」テーブルと「Category」テーブルがある場合、「Products」テーブルをクエリするたびに、各製品の「カテゴリ名」も取得する必要があります。この場合、「join」を使用して「category_name」を取得できます。ただし、これは、ユーザーが製品ページを開くたびに、複雑な結合クエリが実行されることを意味します。したがって、「製品」テーブルに「カテゴリ名」を追加することを検討してください。データが冗長であるにもかかわらず、読み取りパフォーマンスの向上にはそれだけの価値があります。
非正規化方法により、「Product」テーブルの「Category Name」が古くなってしまう可能性があります。したがって、「外部キー」制約を定義する必要がありますが、MySQL はデータを書き込む前に制約をチェックする必要があるため、「外部キー」を使用すると書き込みパフォーマンスが若干遅くなることに注意する必要があります。したがって、最善の選択をするのは常にあなたの仕事です。
英語の元のアドレス: https://codeburst.io/database-performance-optimization-8d8407808b5b
翻訳アドレス: https://learnku.com/mysql/t/71571
[関連する推奨事項: mysql ビデオ チュートリアル ]
以上がMySQL のパフォーマンスを最適化するにはどうすればよいですか?最適化のヒントの共有の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。