1

我敢肯定答案在某种程度上是合乎逻辑的,但是就这样。

我在三列上连接了三个表,每一列都是主键的一部分。我想在 column1 上获得不同的选择。

如果我一次得到整个结果,它就可以工作,即将它导出到一个文件中。但是,如果我像 phpadmin 那样对它进行分页,LIMIT 1000, 0我会得到一些 column1 值两次,例如第 1 页上的 val1 和最后一页上的 val1。这也意味着我没有得到一些我应该拥有的价值。如果我ORDER BY column1再次添加一切正常,但我在最后几页上放慢了速度,或者这就是我被告知的。

我想这与 mysql 处理分页并在不知道整个结果的情况下返回结果的方式有关,但它仍然困扰着我。任何人都可以详细说明。

对查询进行分页的原因是因为我不喜欢一次将表锁定更长的时间。有谁知道如何实现这一目标并同时获取所有数据?

4

1 回答 1

3

在没有 ORDER BY 的情况下使用 LIMIT 实现分页是没有意义的。

是的,你是对的,没有 ORDER BY 会更快,因为服务器可以自由地以任何顺序返回任意结果,并且结果不必从一个查询到下一个查询保持一致。

如果你想要正确和一致的结果,你必须有 ORDER BY。如果您担心性能,请考虑为您订购的列添加索引。

从手册页LIMIT optimization

如果将 LIMIT row_count 与 ORDER BY 一起使用,MySQL 会在找到排序结果的第一个 row_count 行后立即结束排序,而不是对整个结果进行排序。如果使用索引进行排序,则速度非常快。


对查询进行分页的原因是因为我不喜欢一次将表锁定更长的时间。有谁知道如何实现这一目标并同时获取所有数据?

如果您尝试对每一行执行一些操作,那么如果可以添加或删除数据,那么您的方法将不起作用。这是因为它将推送所有以下行,并且某些行将被移动到不同的页面上。添加一行会将一些行推送到下一页,这意味着您会看到一行两次。从较早的页面中删除一行将导致您跳过一行。

相反,您可以使用以下方法之一:

  • 使用一些id来跟踪您的进步程度。选择具有更高的下 n 行id
  • 通过在列中存储布尔值来记录您已处理的行。选择您尚未处理的任何 n 行。
于 2012-06-15T22:58:48.640 回答