2012-06-15 31 views
1

我确定答案在某种程度上是合乎逻辑的,但在这里。mysql不会在连接的表上返回不同的结果并且限制

我有三个表加入三列,每列都是主键的一部分。 我想在column1上得到一个独特的选择。

它可以工作,如果我一次得到整个结果,即我将它导出到一个文件。 但是,如果我分页它像phpadmin会做LIMIT 1000, 0我得到了一些column1值两次,例如,第1页的val1和最后一页的val1。这也意味着我没有获得我应该拥有的一些价值。 如果我添加一个ORDER BY column1一切都可以再次确定,但是我在最后几页失去了速度,或者这是我被告知的。

我想这与mysql处理分页并返回结果的方式有关,但实际上并不知道整个结果,但它仍然会导致我的错误。 任何人都可以详细说明。

分页查询的原因是因为我不喜欢一次锁定较长时间段的表。 有没有人有一个洞察如何实现这一点,同时获得所有的数据?

+0

请显示查询,最好是架构。 –

回答

3

使用不带ORDER BY的LIMIT实现分页没有任何意义。

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

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

从手册页LIMIT optimization

如果使用LIMIT的row_count与ORDER BY,MySQL的结束,因为它已经找到了排序结果的第一ROW_COUNT行尽快排序,而不是排序整个结果。如果使用索引完成排序,则速度非常快。


原因分页查询是因为我不喜欢在一个时间锁定较长时间的表。有没有人有一个洞察力如何实现这一点,同时获得所有的数据?

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

相反,你可以使用这些方法之一:

  • 使用一些id跟踪你到了什么程度。选择id以上的下n行。
  • 记录您通过在列中存储布尔值来处理哪些行。选择尚未处理的任何n行。
+0

1.嗯,我的情况只有在我这样做时才会读取表格。 2. Id的东西可能会工作,但布尔列不会在内部表格上 - 连接的结果。 – pulven

相关问题