LIMIT OFFSET,LENGTH是否需要ORDER BY进行分页?

时间:2011-06-11 08:10:49

标签: mysql

我的MyISAM表有28,900个。我正在以1500块为单位处理它,这样的查询:

SELECT * FROM table WHERE id>0 LIMIT $iStart,1500

然后我循环遍历这个并每次增加$ iStart 1500。

问题是在某些情况下查询返回相同的行。例如,LIMIT 0,1500查询返回一些与LIMIT 28500,1500查询相同的行。

如果我没有对行进行排序,我是否可以不期望使用LIMIT进行分页?

(当这些查询发生时,表是静态的,没有其他任何会改变其行的查询)。

2 个答案:

答案 0 :(得分:16)

与几乎所有其他SQL引擎一样,MySQL MyISAM表根本不保证返回行的顺序,除非您指定ORDER BY子句。通常,它们返回的顺序将是它们从文件系统中读取的顺序,它可以根据更新,删除甚至缓存选择的状态从查询更改为查询。

如果你想避免多次返回相同的行,那么你必须按某种方式排序,主键是最明显的候选者。

答案 1 :(得分:7)

您应该使用ORDER BY来确保订单一致。否则,DBMS可能以任意顺序返回行(但是,如果没有修改行,可以假设它是任意的但在查询之间是一致的。)