ホームページ > データベース > mysql チュートリアル > MySQL クエリ最適化テクニック: パフォーマンスと速度の向上

MySQL クエリ最適化テクニック: パフォーマンスと速度の向上

Linda Hamilton
リリース: 2024-12-24 11:19:15
オリジナル
235 人が閲覧しました

MySQL Query Optimization Techniques: Enhancing Performance and Speed

MySQL クエリ最適化テクニック: パフォーマンスと速度の向上

MySQL クエリの最適化は、データベース駆動型アプリケーションのパフォーマンスを向上させるために不可欠です。小規模なアプリケーションで作業している場合でも、大規模なエンタープライズ システムで作業している場合でも、クエリを最適化すると、特に大規模なデータセットを扱う場合に、応答時間とリソース消費を大幅に削減できます。このガイドでは、SQL クエリの効率を向上させるさまざまな MySQL クエリ最適化手法について説明します。


1. インデックスを使用してクエリを高速化します

インデックスは、特に大きなテーブルを扱う場合、クエリのパフォーマンスを向上させるために非常に重要です。適切なインデックス作成により、MySQL がスキャンする必要がある行数が減り、クエリの実行が高速化されます。

  • 主インデックスと一意のインデックス: データの整合性を確保し、検索操作を高速化するために、主キーと一意のキーにインデックスが付けられていることを常に確認してください。

  • 複合インデックス: クエリの WHERE、JOIN、または ORDER BY 句に複数の列が含まれる場合、複合インデックスを使用してそれらの列をカバーします。

CREATE INDEX idx_name_department ON employees(name, department);
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
  • カバー インデックス: カバー インデックスにはクエリに必要なすべてのカラムが含まれており、MySQL がテーブルにアクセスせずにインデックスから完全にクエリを処理できるようにします。
CREATE INDEX idx_covering ON employees(name, department, salary);
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
  • インデックスの過剰作成を避ける: インデックスが多すぎると、書き込みパフォーマンス (INSERT、UPDATE、DELETE) に悪影響を及ぼす可能性があります。頻繁にクエリされる列に対してのみインデックスを作成します。

2. SELECT ステートメントを最適化する

  • 必要な列のみを選択: すべての列を取得するため、SELECT * の使用は避けてください。代わりに、必要な列のみを指定すると、転送されるデータ量が削減されます。
SELECT name, department FROM employees WHERE salary > 50000;
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
  • 複雑な結合とサブクエリを避ける: 非効率なクエリ プランを引き起こす可能性がある複雑な結合とサブクエリの使用を最小限に抑えます。代わりに、可能な場合は単純な結合とサブクエリを使用してください。

  • 返される行数を制限する: 結果セット全体を取得する必要がない場合は、LIMIT 句を使用して返される行数を制限します。

SELECT name FROM employees WHERE department = 'Engineering' LIMIT 10;
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

3. WHERE 句を最適化する

WHERE 句は、多くの場合、クエリ内のレコードをフィルターする場所です。クエリのこの部分を最適化すると、パフォーマンスが大幅に向上します。

  • WHERE でインデックス付きカラムを使用する: WHERE 句がインデックス付きカラムに基づいて行をフィルタリングする場合、MySQL はインデックスを使用して一致する行をすばやく見つけることができます。
CREATE INDEX idx_name_department ON employees(name, department);
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
  • インデックス付きカラムでは関数を避ける: インデックス付きカラムに対して関数 (LOWER()、YEAR() など) を使用するとインデックスが無効になり、MySQL がテーブル全体のスキャンを実行します。
CREATE INDEX idx_covering ON employees(name, department, salary);
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
  • WHERE 句で OR を使用しないでください: OR 条件は、特にインデックスが作成されていない列に対して使用すると遅くなる可能性があります。可能であれば、クエリを複数のクエリに分割します。
SELECT name, department FROM employees WHERE salary > 50000;
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

4. 適切な結合を使用する

  • 適切な結合タイプを選択してください: 可能な場合は常に INNER JOIN を使用してください。通常、一方または両方のテーブルの不一致行を含む LEFT JOIN や RIGHT JOIN よりも高速です。
SELECT name FROM employees WHERE department = 'Engineering' LIMIT 10;
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
  • 結合条件: WHERE 句で行をフィルタリングするのではなく、常に明示的な結合条件 (例: ON e.Department_id = d.id) を使用します。これにより、MySQL がインデックスをより効果的に使用できるようになります。
SELECT * FROM employees WHERE department = 'Engineering';
ログイン後にコピー
ログイン後にコピー

5. クエリ キャッシュを使用する

MySQL には、SELECT クエリの結果を保存するクエリ キャッシュ機能が組み込まれています。同じクエリが再度実行されると、MySQL はクエリを再度実行するのではなく、キャッシュから結果を取得します。

  • クエリ キャッシュを有効にする: MySQL では、構成ファイル (my.cnf) で次のパラメータを設定してクエリ キャッシュが有効になっていることを確認します。
-- Inefficient (disables index)
SELECT * FROM employees WHERE YEAR(joined_date) = 2020;

-- Efficient (uses index)
SELECT * FROM employees WHERE joined_date BETWEEN '2020-01-01' AND '2020-12-31';
ログイン後にコピー
  • SELECT クエリのみをキャッシュ: クエリ キャッシュには、SELECT クエリの結果のみが保存されます。頻繁に変更される動的クエリのキャッシュは避けてください。

6. Group By と Order By を最適化します

  • グループ化と並べ替えのためのインデックス: GROUP BY および ORDER BY 操作に頻繁に関与する列にインデックスを使用します。
-- Inefficient query
SELECT * FROM employees WHERE department = 'Engineering' OR department = 'Sales';

-- Efficient query
SELECT * FROM employees WHERE department = 'Engineering';
SELECT * FROM employees WHERE department = 'Sales';
ログイン後にコピー
  • 並べ替え前に結果を制限: 可能であれば、ORDER BY を実行する前に行数を制限します。これにより、MySQL がソートする必要がある行の数が減ります。
-- Efficient (Inner join)
SELECT e.name, d.department_name FROM employees e INNER JOIN departments d ON e.department_id = d.id;
ログイン後にコピー
  • 大規模な結果セットのソートを避ける: 大規模な結果セット (LIMIT を指定した ORDER BY) のソートは時間がかかる可能性があります。常に、できるだけ早い段階で結果セットを制限するようにしてください。

7. サブクエリの最適化

サブクエリは、パフォーマンスを向上させるために、結合 または 一時テーブル としてより効率的に書き直すことができます。

  • 相関サブクエリを避ける: 相関サブクエリは外側のクエリの行ごとに 1 回実行されるため、非常に非効率的になる可能性があります。結合または派生テーブルの使用を検討してください。
CREATE INDEX idx_name_department ON employees(name, department);
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
  • 複雑なサブクエリには一時テーブルを使用する: サブクエリが非常に複雑な場合は、パフォーマンスを向上させるためにサブクエリを一時テーブルに分割することを検討してください。
CREATE INDEX idx_covering ON employees(name, department, salary);
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

8. EXPLAIN を使用してクエリを分析する

EXPLAIN キーワードを使用して、MySQL がクエリを実行する方法を分析します。これにより、クエリ実行計画についての洞察が得られ、テーブル全体のスキャンや非効率な結合などの潜在的なボトルネックを特定するのに役立ちます。

SELECT name, department FROM employees WHERE salary > 50000;
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

次を探します:

  • タイプ: 結合タイプ (ALL、インデックス、範囲など) — ALL はテーブル全体のスキャンを示すため、最悪です。
  • Key: MySQL がクエリに使用しているインデックス。 NULL が返された場合、インデックスは使用されていません。
  • : MySQL が検査する予定の推定行数。

9. クエリで LIMIT を使用します

大きなテーブルを扱う場合、特にテストやデバッグの場合は、返される行数を常に制限してください。これにより、クエリの実行にかかる時間が短縮され、特に SELECT クエリで役立ちます。

SELECT name FROM employees WHERE department = 'Engineering' LIMIT 10;
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

10.データ型の最適化

適切なデータ型を使用すると、クエリのパフォーマンスが向上します。例:

  • 整数値には VARCHAR の代わりに INT を使用します。
  • 日付値には、VARCHAR の代わりに DATE または DATETIME を使用します。
  • 小さなデータには TEXT または BLOB の使用を避けてください。必要に応じて VARCHAR を使用してください。
SELECT * FROM employees WHERE department = 'Engineering';
ログイン後にコピー
ログイン後にコピー

結論

MySQL クエリの最適化は、データベース駆動型アプリケーションのパフォーマンスと効率を向上させるために不可欠です。インデックス作成、クエリの簡略化、結合の最小化、WHERE 句の最適化、EXPLAIN の使用などの最適化手法に従うことで、クエリの実行時間とシステム リソースの使用量を削減できます。

クエリを定期的に分析し、パフォーマンスを監視し、これらの手法を実装して、MySQL クエリが最高の効率で実行されていることを確認します。クエリの最適化は継続的なプロセスであり、これらのベスト プラクティスを一貫して適用することで、最適なデータベース パフォーマンスを達成することができます。


以上がMySQL クエリ最適化テクニック: パフォーマンスと速度の向上の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート