顺序运行一个包含1,000,000条记录的MYSQL表?

时间:2012-05-09 17:44:54

标签: mysql

我建立了一个拥有约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 - 但是出现了同样的问题。

欢迎提供任何帮助。谢谢。

1 个答案:

答案 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列上有索引,这将特别快。