ORDER BY排序后,有大坑用LIMIT取前几条,切记起用发现返回的有大坑结果集的顺序与预期的不一样。 下面是切记起用我遇到的问题: 可以看到,带LIMIT与不带LIMIT的有大坑结果与我预期的不一样,而且“很不可思议”,切记起用真是有大坑百思不得其解。 后来百度了一下,切记起用如果order by的有大坑列有相同的值时,mysql会随机选取这些行,切记起用为了保证每次都返回的有大坑顺序一致可以额外增加一个排序字段(比如:id),用两个字段来尽可能减少重复的切记起用概率。 于是有大坑,改成 order by status,切记起用 id; 问题虽然是解决了,但还是有大坑看看官方文档上怎么说的吧! 摘自“LIMIT查询优化” 如果你只需要结果集中的指定数量的行,亿华云计算那么请在查询中使用LIMIT子句,而不是抓取整个结果集并丢弃剩下那些你不要的数据。 MySQL有时会优化一个包含LIMIT子句并且没有HAVING子句的查询: 如果ORDER BY列有多行具有相同的值,服务器可以自由地以任何顺序返回这些行,并且根据总体执行计划可能以不同的方式返回。换句话说,这些行的排序顺序对于无序列是不确定的。 影响执行计划的一个因素是LIMIT,服务器托管因此对于一个ORDER BY查询而言,带与不带LIMIT返回的行的顺序可能是不一样的。 看下面的例子: 包含LIMIT可能会影响每一个category行的顺序。例如: 如果你需要确保无论带不带LIMIT都要以相同的顺序返回,那么你可以在ORDER BY中包含附加列,以使顺序具有确定性。例如: 1、如果你只需要结果集中的某几行,那么建议使用limit。这样这样的话可以避免抓取全部结果集,然后再丢弃那些你不要的行。 2、对于order by查询,带或者不带limit可能返回行的顺序是不一样的。 3、如果limit row_count 与 order by 一起使用,那么在找到第一个row_count就停止排序,直接返回。 4、如果order by列有相同的值,那么MySQL可以自由地以任何顺序返回这些行。换言之,只要order by列的值不重复,就可以保证返回的顺序。 5、可以在order by子句中包含附加列,以使顺序具有确定性。 现象与问题
LIMIT查询优化
小结
上一篇
下一篇