1

約1,000,000の製品を含むサイトを構築しました。すべての製品へのリンクを含む一連のサイトマップを作成したいと思います。サイトマップには最大50,000のリンクが含まれている可能性があることを理解しているので、このようなサイトマップを20個作成する予定です。

これを一連のSQLステートメントで実現したいと思います。私の計画:1,000個の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未満の場合、ステートメントは.3秒未満で実行されました。しかし、私が試したとき:

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

ステートメントの実行にかかる時間は30秒に跳ね上がりました!そして、その後のすべてのステートメントの実行には、同様に長い時間がかかりました。

私が試したもう1つのことは、2番目の引数をLIMITに増やすことでしたが、同じ問題が発生しました。

どんな援助も歓迎します。ありがとうございました。

4

1 に答える 1

4

を使用LIMITするには、MySQL が制限まですべての行をフェッチする必要がありますが、関心のない行は破棄します。つまり、クライアントに返さないだけです。したがって、フェッチ (および破棄) する行が数千行ある場合、実行時間が大幅に短縮される可能性があります。

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

列にインデックスがある場合、これは特に高速になりidます。

于 2012-05-09T17:48:13.190 に答える