1

質問は、リスト データとリード データを 2 つのテーブルに保持するリスト サイトに関するものです。リスティングと各リスティングの合計リード数のクエリを実行すると、ORDER BY を追加した後、結果が非​​常に遅くなります。ORDER BY を使用しないと、結果は非常に高速に取得されます。以下のクエリの再構築に関するアドバイスやヘルプは素晴らしいでしょう!! 参考までに、20,000 件のリストと 100,000 件のリードがあります。

SELECT ls.*, IFNULL(ld.total_leads, 0) AS total_leads
FROM listing ls 
LEFT JOIN (SELECT listing_id, COUNT(listing_id) AS total_leads 
            FROM lead GROUP BY listing_id) ld
ON (ls.listing_id = ld.listing_id)
ORDER BY ls.listing_id DESC LIMIT 0,20

説明:

id select_type table type pos key ke ref rows Extra 
1 PRIMARY ls ALL NULL NULL NULL NULL 17215 Using temporary; Using filesort 
1 PRIMARY 2> ALL NULL NULL NULL NULL 12865 
2 DERIVED lead ALL NULL NULL NULL NULL 117830 Using temporary; Using filesort
4

2 に答える 2

2

簡単な答え: にインデックスを作成しますlisting_id

(半)長い答え: これにより、その列による順序付けが高速化されます(ただし、挿入は遅くなります)。詳細: http://dev.mysql.com/doc/refman/5.5/en/order-by-optimization.html

于 2012-10-18T10:54:22.263 に答える
0

2 つのテーブルの listing_id にインデックスを作成します。

order by 句を含めると、データベースは正しい順序で行のリストを作成し、その順序でデータを返す必要があります。これには多くの余分な処理が必要になり、余分な時間がかかる可能性があります。

クエリが返す可能性のある多数の列を並べ替えるには、おそらく時間がかかります。ある時点でバッファ領域が不足し、データベースがスワッピングを開始する必要があり、パフォーマンスが低下します。

返される列を少なくして (Select * の代わりに必要な列を指定して)、クエリがより速く実行されるかどうかを確認してください。

于 2012-10-18T10:56:31.503 に答える