使用select *得到不同的结果并选择askid

时间:2015-08-31 03:11:52

标签: mysql sql

这听起来很有线,当我尝试优化limit时偶尔会发现这种情况。

askid是 PK ,表中有 1.14M 行。
我不能放桌子,因为它在生产环境中。

我试试

SELECT askid FROM ask limit 1000000,1;

返回 1001747

然后我尝试

SELECT * FROM ask limit 1000000,1;

返回 1000627

askid有索引并影响结果,但我认为结果应该是相同的,不是吗?

SELECT askid FROM ask ORDER BY askid LIMIT 1000000,1;

返回 1000627

但为什么ORDER BY很重要?askid索引有问题吗?

表现差异很大 第一个需要 0.2s ;
第二个需要 2s ;
第三个需要 1s ;
如何优化并获得正确的结果?

我使用的mysql版本是 5.6.10

3 个答案:

答案 0 :(得分:0)

您的OFFSET设置为1000000。那些查询不一样。 * SELECT所有内容,而不仅仅是PRIMARY KEY。在,之后LIMIT成为LIMIT offset, limit。此外,您应该对这些查询使用ORDER BY askid,以便获得正确的顺序。

答案 1 :(得分:0)

SQL不保证行顺序,它根据您的查询选择最佳计划的任何内容。

如果您需要订单,请使用order by指定。如果你限制你的结果集,你绝对应该这样做。

答案 2 :(得分:0)

数据以自然顺序存储。这可以是插入行的顺序,也可以是行更新的顺序,具体取决于引擎。 PK订单

当您未指定order by时,您将获得自然顺序(对于所有意图和目的,它是随机的)。你不应该依赖它。

你可以争辩所有你喜欢,但你已经向自己证明应该使用order by