0

質問があります:

SELECT listings.*, listingagents.agentid
FROM listings
LEFT JOIN listingagents ON (listingagents.id = listings.listingagentid)
LEFT JOIN ignore ON (ignore.system_key = listings.listingid)
WHERE ignore.id IS NULL
ORDER BY listings.id ASC

このクエリは非常に遅く、MySQLサーバーに大きな負荷をかけているため、このクエリのパフォーマンスを改善しようとしています。

mysqlの説明を行うと、出力には次のように表示されます。

+ -------- + ------------- + --------------- + -------- +- -------------- + ------------ + --------- + ------------ ---------------- + -------- + ------------------------ -+
| id | select_type | テーブル| タイプ| possible_keys | キー| key_len | ref | 行| エクストラ|
+ -------- + ------------- + --------------- + -------- +- -------------- + ------------ + --------- + ------------ ---------------- + -------- + ------------------------ -+
| 1 | シンプル| リスト| すべて| NULL | NULL | NULL | NULL | 383360 | filesortの使用|
| 1 | シンプル| リスティングエージェント| eq_ref | プライマリー| プライマリー| 4 | db.listings.listingagen ... | 1 | |
| 1 | シンプル| 無視する| ref | system_key | system_key | 1 | const | 404 | whereを使用する; 存在しません|
+ -------- + ------------- + --------------- + -------- +- -------------- + ------------ + --------- + ------------ ---------------- + -------- + ------------------------ -+

私は簡単なクエリを実行しようとしました:

SELECT listings.*
FROM listings
ORDER BY listings.id ASC

また、そのクエリには「Usingfilesort;」もあります。

フィールド「listings.id」、「listingagents.id」、および「ignore.id」は主キーです。フィールド「listingagents.id」および「ignore.system_key」にはインデックスがあります。

最初のクエリを改善するにはどうすればよいですか?

4

1 に答える 1

0

いくつかの条件を追加して、リストの範囲 (現在は 383360 行) を減らしてみてください。例: id > x または limit。

于 2012-04-19T17:01:55.790 に答える