2011-06-11 85 views
13

我有一个28,900的MyISAM表。我正在处理它在1500块,这样的查询:极限偏移量,长度是否需要ORDER BY分页?

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

然后,我循环这一点,每次增加$ iStart 1500。

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

如果我没有对行进行排序,我不希望使用LIMIT进行分页吗?

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

回答

16

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

如果您想避免让同一行返回多次,那么您必须按照某种顺序排列,主键是最明显的候选项。

+0

为了扩大这一点,我已经看到了innodb表发生的这种情况,并且结果不一定在文件系统顺序中,+1表示“你必须按某种东西排序”。 – ChrisInEdmonton 2012-07-24 01:34:45

7

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

+2

如果没有行被修改,查询之间不一致,至少用innodb。大体一致,这几乎更糟糕。 :( – ChrisInEdmonton 2012-07-24 01:35:19

+0

永远不要做这个假设 – 2017-06-09 09:56:35