ホームページ >データベース >mysql チュートリアル >遅い MySQL SELECT クエリを最適化して Web ページのパフォーマンスを向上するにはどうすればよいでしょうか?

遅い MySQL SELECT クエリを最適化して Web ページのパフォーマンスを向上するにはどうすればよいでしょうか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-30 08:39:14528ブラウズ

How Can We Optimize a Slow MySQL SELECT Query to Improve Web Page Performance?

パフォーマンスを向上させるために最適化された遅い MySQL 選択クエリ

この MySQL クエリは、その複雑さとデータ量により遅延が発生しています。これを軽減するには、関連するテーブル間の関係を理解することが重要です。

  • poster_data: 個々のポスターにデータを保存します。
  • poster_categories: 利用可能なすべてのカテゴリをリストします (例: 映画、 art).
  • poster_prodcat: ポスターをそれぞれのカテゴリにリンクします。単一のポスターに複数のエントリが可能です。

元のクエリは次のように表示されます。特に 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」出力で特定されました:

[Explain Image Link]

観察されたとおり、クエリにはデータをディスクに書き込むため、重大な影響を与える

解決策:

この問題に対処するために、複合インデックスを使用して改訂されたスキーマが設計されました。この新しい構造により、パフォーマンスの大幅な向上が実証されました。

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

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

DROP TABLE IF EXISTS poster_category;
CREATE TABLE poster_category
(
cat_id MEDIUMINT UNSIGNED NOT NULL,
poster_id INT UNSIGNED NOT NULL,
PRIMARY KEY (cat_id, poster_id) -- Note the clustered composite index !!
)
ENGINE = INNODB;

複合インデックスを配置すると、次の改訂されたクエリは超高速の結果を生成しました。

SELECT
p.*,
c.*
FROM
poster_category pc
INNER JOIN category c ON pc.cat_id = c.cat_id
INNER JOIN poster p ON pc.poster_id = p.poster_id
WHERE
pc.cat_id = 623
ORDER BY
p.name
LIMIT 32;

この最適化されたアプローチにより、問題が効果的に解決されました。パフォーマンスの問題により、アプリケーションの Web ページの応答性が高く、ユーザーフレンドリーになります。

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

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