我建立了一个拥有约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时,语句在0.3秒内执行。但是当我尝试时:
SELECT name, category, catalog_number FROM product ORDER BY id LIMIT 29000, 1000
执行语句所需的时间跳到30秒!之后的每个陈述都花了相同的时间来执行。
我尝试的另一件事是将第二个参数增加到LIMIT - 但是出现了同样的问题。
欢迎提供任何帮助。谢谢。
答案 0 :(得分: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
列上有索引,这将特别快。