【问题标题】:Does LIMIT OFFSET,LENGTH require ORDER BY for pagination?LIMIT OFFSET,LENGTH 是否需要 ORDER BY 进行分页?
【发布时间】:2011-09-12 23:31:31
【问题描述】:

我有一个包含 28,900 个整体的 MyISAM 表。我以 1500 块为单位处理它,查询如下:

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

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

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

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

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

【问题讨论】:

    标签: mysql


    【解决方案1】:

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

    如果你想避免多次返回同一行,那么你必须按一些东西排序,主键是最明显的候选者。

    【讨论】:

    • 进一步扩展,我已经看到 innodb 表发生了这种情况,结果不一定按文件系统顺序排列。 +1 表示“您必须按一些东西订购”。
    【解决方案2】:

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

    【讨论】:

    • 如果没有行被修改,查询之间的不一致,至少在 innodb 中是这样。大部分是一致的,这几乎更糟。 :(
    • 永远不要做出这样的假设。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 2019-06-26
    • 1970-01-01
    相关资源
    最近更新 更多