ホームページ >データベース >mysql チュートリアル >遅い MySQL クエリを最適化してパフォーマンスを向上させ、ディスク I/O を削減するにはどうすればよいですか?

遅い MySQL クエリを最適化してパフォーマンスを向上させ、ディスク I/O を削減するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-30 20:24:11964ブラウズ

How Can I Optimize a Slow MySQL Query to Improve Performance and Reduce Disk I/O?

実行時間とディスク書き込みを削減するための MySQL クエリの最適化

MySQL クエリの完了と書き込みに数分かかるため、パフォーマンスの問題が発生しています。実行中のディスク。これは、Web ページの応答性に大きな影響を与える可能性があります。これに対処するために、データ モデリングとインデックスの最適化を伴う解決策を検討します。

あなたが言及した遅いクエリは次のとおりです:

SELECT * 
FROM poster_prodcat, 
     poster_data, 
     poster_categories 
WHERE poster_data.apnumber = poster_prodcat.apnumber 
  AND poster_categories.apcatnum = poster_prodcat.apcatnum 
  AND poster_prodcat.apcatnum='623'  
ORDER BY aptitle ASC 
LIMIT 0, 32

EXPLAIN 出力によると、クエリは完全なクエリを実行しています。 1,700 万行以上を含む、poster_prodcat テーブルのテーブル スキャン。これが過剰な実行時間の原因となっています。

クエリのパフォーマンスを最適化するには、次の変更を実装できます:

正規化とインデックス作成:

  1. データの正規化: poster_prodcat テーブルを正規化されたテーブルに変換します。ポスターとカテゴリーの 2 つのテーブルを含む構造。 3 番目のテーブル、poster_category を作成して、ポスターとカテゴリ間の関係を確立します。
  2. インデックスの作成: ポスター、カテゴリ、およびポスター_カテゴリ テーブルの適切な列にインデックスを作成します。これにより、データベースはテーブル全体のスキャンを実行しなくても、データをすばやく見つけられるようになります。

更新されたスキーマの例を次に示します。

CREATE TABLE poster (
  poster_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  name VARCHAR(255) NOT NULL UNIQUE,
  PRIMARY KEY (poster_id)
) ENGINE=InnoDB;

CREATE TABLE category (
  cat_id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
  name VARCHAR(255) NOT NULL UNIQUE,
  PRIMARY KEY (cat_id)
) ENGINE=InnoDB;

CREATE TABLE poster_category (
  cat_id MEDIUMINT UNSIGNED NOT NULL,
  poster_id INT UNSIGNED NOT NULL,
  PRIMARY KEY (cat_id, poster_id),
  INDEX (poster_id) -- Clustered composite index
) ENGINE=InnoDB;

データが正規化され、インデックスが作成されると、を実行すると、クエリの実行が大幅に高速化され、実行時間が大幅に短縮されます。

以上が遅い MySQL クエリを最適化してパフォーマンスを向上させ、ディスク I/O を削減するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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