ホームページ  >  記事  >  データベース  >  MySQL の高度なドリフトについての深い理解 (6)

MySQL の高度なドリフトについての深い理解 (6)

黄舟
黄舟オリジナル
2017-03-08 13:57:521187ブラウズ

パフォーマンスの最適化

インデックス

インデックスは、特定のデータが配置されているデータベース内の場所を指します。列にインデックスを作成すると、列の情報を整理できます。サーバーがクエリのためにこの情報にアクセスする必要がある場合、インデックスが関連する場所を指しているため、どこを調べればよいかがわかります。

列にクエリ、グループ化、並べ替えが含まれる場合、インデックスによってパフォーマンスを向上させることができます。
重複した値が多く含まれるインデックスは良い結果を生成しません。
テーブルを使用して複数の非一意のインデックスを結合し、パフォーマンスを向上させることができます。
インデックスが多ければ多いほど、必ずしもパフォーマンスが向上するとは限りません。インデックスを追加しても、必ずしもパフォーマンスが向上するとは限りません。

クエリキャッシュ

選択クエリを実行すると、MySQL4.x はクエリを記録し、結果を返します。これは、選択クエリが作成されるたびに結果セットを特別なキャッシュに保存することによって実現されます。その後、サーバーが同じクエリを再度実行するように要求されると、MySQL はクエリを再度実行するのではなく、キャッシュから結果を取得します。 この機能はデフォルトで有効になっています。

テーブルが変更されると、このテーブルを使用するキャッシュされたクエリは無効になり、キャッシュから削除されることに注意してください。これにより、クエリが古いテーブルから不正確なデータを返すのを防ぎます。頻繁に変更されるテーブルにはキャッシュのメリットがありません。この場合、キャッシュを使用しないことを検討し、オプション sql_no_cache を追加してこれを実現できます。

クエリ分析

選択クエリの先頭に Explain キーワードを追加します。これにより、このクエリが処理されると、このグラフにはクエリがアクセスするテーブルとクエリが何を期待しているのかに関する情報が含まれることを示すグラフを返すように MySQL に指示されます。行番号情報を返します。この情報を使用して、実行を高速化するためにどのテーブルにインデックスを作成できるかを確認し、ボトルネックがどこにあるのかを分析できます。

表示されたクエリ結果を通じて、インデックスを追加する場所を確認し、簡単に修正することができます。

複数テーブル クエリを最適化する

サブクエリは、別の select ステートメント内にネストされた select ステートメントです。サブクエリは、複雑なクエリを一連の論理ステップに分割したり、他のクエリの結果を使用してクエリに回答したりするためによく使用されます。その結果、2 つ以上の個別のクエリを実行する代わりに、1 つ以上のサブクエリを含む単純なクエリを実行できるようになります。

MySQL はサブクエリよりもジョインを最適化できるため、MySQL サーバーの負荷平均が許容できないほど高いレベルに達していることが判明した場合は、アプリケーション コードを調べて、ジョインおよびジョイン シーケンスのサブクエリとして書き直してみる必要があります。

MySQL のコレクション機能を効果的に使用し、プロシージャを変更することで、非効率なサブクエリをより効率的な結合に変換できます。
途中でネストされたクエリの使用を避けたい場合は、セッションベースのサーバー変数を使用することもできます。

一時テーブルの使用

MySQL では、一時テーブルの作成コマンドを使用して一時テーブルを作成することもできます。この種類のテーブルは、単一の MySQL セッションに対してのみ存在し、これらのテーブルを使用するクライアントが MySQL サーバーへの接続を閉じると、自動的に削除されるため、このように呼ばれます。

一時テーブルはメモリに保存されるため、ディスクベースのテーブルよりも大幅に高速です。結果は、クエリの実行速度を向上させるための中間ストレージ領域として効果的に使用したり、複雑なクエリをより単純なコンポーネントに分割したり、サブクエリや結合サポートの代替として使用したりできます。

テーブル設計を最適化する

クエリをより洗練させるには、テーブル設計のいくつかの要素を考慮する必要があります。まず、頻繁にクエリが実行されるテーブルに多くの変更が加えられる場合、パフォーマンスを向上させる方法は、可変長フィールドの代わりに固定長フィールドを使用することです。固定長フィールドを使用するとより多くのディスク領域が浪費されますが、クエリの観点から見ると、MySQL は固定長フィールドを可変長フィールドよりも高速に処理します。

パフォーマンスを向上させるもう 1 つの手法は、頻繁に変更する必要があるテーブルに対してテーブルの最適化コマンドを使用することです。テーブルを頻繁に変更すると、ディスクの断片化が発生し、必要なデータを取得するために未使用の領域ブロックからの読み取りに余分な時間がかかる可能性があります。

パフォーマンスの向上を検討する場合は、作成されたすべてのテーブルを対象にする必要があるかどうかも確認してください。余分なテーブルはパフォーマンスの低下を意味します。テーブルをマージする必要がない場合は、結合された列を一致させる必要があります。

サーバー設定を調整する

サーバーをより効率的に実行したい場合、最善の解決策は、メモリ領域を増やし、より大きくて高速なディスクを使用することです。しかし、多くの場合、状況がそれを許しません。 この時点で、サーバーを改善するための一般的なテクニックが必要になります。

サーバー変数を調整します。 key_buffer_size 変数は、MySQL インデックス バッファーが使用できるメモリの量を制御します。値が大きいほど、インデックスで使用できるメモリが増え、パフォーマンスが向上します。 通常、この値は使用可能な合計メモリの 25% ~ 30% に保たれます。 table_cache 変数は、テーブル キャッシュが使用できるメモリの量と、MySQL が一度に処理できるテーブル オープンの総数を制御します。多数のデータベースとテーブルを備えた非常に負荷の高いサーバーの場合は、set を使用してこの値を増やし、変更する必要があります。

グローバル サーバー変数が変更されると、これらの変数はサーバーがシャットダウンされるまで存在しますが、サーバーが再起動されると、変数はデフォルトの状態に戻ります。 したがって、永続的な変更を加えた方がよいでしょう。


以上がMySQL の高度なドリフトについての深い理解 (6)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。