2012-05-09 29 views
1

私はそこに約1,000,000の製品を持つサイトを構築しました。私はすべての製品へのリンクを含むサイトマップのセットを構築したいと思います。サイトマップには最大50,000件のリンクが含まれている可能性があることを理解していますので、20個のサイトマップを作成することを計画しています。順番に、1,000,000レコードのMYSQLテーブルを実行しますか?

私はこれを一連のSQL文で実行したいと考えています。私の計画:1,000個のSQL文.1000個のSQL文。それぞれ1,000個の製品をプルします。 SQL文は次の行になります。

SELECT name, category, catalog_number FROM product ORDER BY id LIMIT 0, 1000 
SELECT name, category, catalog_number FROM product ORDER BY id LIMIT 1000, 1000 
SELECT name, category, catalog_number FROM product ORDER BY id LIMIT 2000, 1000 
SELECT name, category, catalog_number FROM product ORDER BY id LIMIT 3000, 1000 

などです。

問題は、LIMIT(オフセット)の最初の引数が大きくなると、各SQLの実行に要する時間が非常に短くなることです。具体的には、LIMITの最初の引数が28000未満の場合、文は0.3秒以内に実行されます。しかし、私が試したときに:

SELECT name, category, catalog_number FROM product ORDER BY id LIMIT 29000, 1000 

ステートメントを実行するのにかかる時間は30秒にジャンプしました!それ以降のすべてのステートメントは、同様に実行に時間がかかりました。

もう1つは、引数をLIMITに引き上げることでしたが、同じ問題が発生しました。

援助を歓迎します。ありがとうございました。

+0

サイトマップを動的に作成するのではなく、クエリからサイトマップファイルを生成することを検討してください。 –

+0

それは私がそれを正確に処理した方法です。 :) – oyvey

答えて

4

LIMITを使用すると、MySQLはすべての行を制限までフェッチする必要がありますが、興味のないものは破棄するだけです。つまり、単にクライアントに返さないだけです。したがって、フェッチする(および破棄する)ために何千もの行があると、実行時間を劇的に損なう可能性があります。

代わりに、あなたが最後に見たidを追跡してください。そして、常にその上でフィルタリング:id列に索引がある場合

SELECT name, category, catalog_number 
FROM  product 
WHERE id >= ? -- the last one you saw, or 0/omit if none 
ORDER BY id 
LIMIT 1000 

は、これは特に、高速になります。

+0

Groovy!問題が解決しました。 1つの注意点:idフィールドも選択するようにselectを変更する必要がありました。 :) – oyvey

関連する問題