mysql 不会在连接表和限制上返回不同的结果

标签 mysql

我确信这个答案在某种程度上是合乎逻辑的,但这里是。

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

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

我猜这与 mysql 处理分页的方式有关,并在不知道整个结果的情况下返回结果,但它仍然困扰着我。 谁能详细说明一下。

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

最佳答案

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

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

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

来自手册页 LIMIT optimization :

If you use LIMIT row_count with ORDER BY, MySQL ends the sorting as soon as it has found the first row_count rows of the sorted result, rather than sorting the entire result. If ordering is done by using an index, this is very fast.


The reason for paginating the query is because I don't like to lock the tables for longer periods at a time. Does anyone have a insight how to achieve this and at the same time get all the data?

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

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

  • 使用一些 id 来跟踪您的进度。选择具有更高 id 的下 n 行。
  • 通过在列中存储一个 bool 值来记录您处理了哪些行。选择您尚未处理的任意 n 行。

关于mysql 不会在连接表和限制上返回不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11059147/

上一篇:MySQL 和 LIKE 比较与 %

下一篇:Mysql列连接

相关文章:

mysql - sql CHECK 约束无法正常工作

java - 替换java准备的mysql查询语句中的字符串?

mysql - 获取特定标识符的最新行

MySQL - 内连接和分组依据

mysql - 从另一个存储过程中的存储过程返回表

mysql - mysql 中的开/关查询?

php - mysql_query 只为 int/fload 数据库类型返回字符串类型

javascript - 如何使用 Express js 将请求正文插入 MySQL 数据库?

php - Codeigniter 查询不插入

java - 使用 MySQL 的 SimpleJdbcInsert