ホームページ  >  記事  >  データベース  >  高パフォーマンスMySQL - 特定タイプのクエリの最適化について詳しく説明

高パフォーマンスMySQL - 特定タイプのクエリの最適化について詳しく説明

黄舟
黄舟オリジナル
2017-03-15 17:23:481666ブラウズ


このセクションでは主に、いくつかの特定の種類の最適化クエリについて説明します。
(1) カウントクエリの最適化
(2) 関連クエリ
(3) サブクエリ
(4) GROUP BY と DISTINCT の最適化
(5) LIMIT ページングの最適化

カウントクエリの最適化

COUNT() 集計関数の役割:
(1) 特定の列の値の数をカウントし、行数をカウントすることもできます。 列の値をカウントする場合、列の値は空ではない必要があることに注意してください(NULLはカウントしません)

(2) 結果セット内の行数をカウントします。列の値を空にできない場合、テーブル内の行数がカウントされます。ただし、結果セット内の行数を取得するには COUNT() を使用する必要があります。 Wildcard は、すべての列の値を直接無視し、最適化のために行数を直接計算します。

MyISAM ストレージ エンジンの場合、MyISAM 自体がすでに合計行数を格納しているため、where クエリ条件が 1 つのテーブルに制限されていない場合、COUNT(*) は非常に高速です。 where 修飾条件がある場合は、クエリ統計も必要です。

以下は簡単な最適化の使用例です:
(1) 最適化 1:

高パフォーマンスMySQL - 特定タイプのクエリの最適化について詳しく説明

id > 100 のレコードを直接チェックすると、2,000 万行を超えるレコードがスキャンされることがわかります。ただし、COUNT() 機能により、count() - (id

(2) 最適化 2:
さらに、カバリングインデックスを使用する別の最適化方法もあります。

連想クエリの最適化

(1) ON 句または USING 句の列にインデックスがあることを確認します。インデックスを作成するときは、テーブル A とテーブル B が列 c に関連付けられている場合、オプティマイザの関連付け順序が B、A の場合、テーブル A にインデックスを作成するだけで済みます。未使用のインデックスはストレージを占有します


(2) Group by 操作と order by 操作の には、1 つのテーブル内の列のみが含まれるようにしてください。このようにして、MySQL でインデックス最適化を使用することが可能です。

subquery

一時テーブルが count(*) のように非常に小さい場合を除き、サブクエリは一時テーブルを生成するため、サブクエリの使用をできるだけ少なくします。

GROUP BY と DISTINCT の最適化

GROUP BY と DISTINCT を最適化する最も効果的な方法は、インデックスを使用することです。

インデックスを使用できない場合、group by は 2 つの戦略を使用します。グループ化のための一時テーブルまたはファイルの並べ替えです。

グループ化するすべての列にインデックスを付ける必要があります。例:

select product, count(*) from orders group by product;

のようなクエリの場合、商品にインデックスを付ける必要があります。

ページングの最適化を制限する

ページング操作を実行するとき、通常、一部のデータはオフセットを通じてクエリされます。説明した order by と相まって、パフォーマンスは全体的に良好です。

order by 列に必ずインデックスを追加してください。

ただし、制限 10000、10 の場合、ターゲットの 10 レコードを取得するには、まず前の 10000 レコードをクエリする必要があります。この場合、コストが非常に高くなります。最適化する最も簡単な方法は、カバーリング インデックスを使用することです。

以上が高パフォーマンスMySQL - 特定タイプのクエリの最適化について詳しく説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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