パフォーマンスを向上させるために最適化された遅い 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」出力で特定されました:
[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 サイトの他の関連記事を参照してください。