这听起来很有线,当我尝试优化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
答案 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
。