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子句中包含附加列,以使顺序具有确定性。
责任编辑:庞桂玉 来源: 良许Linux MySQLORDER BYIMIT
(责任编辑:时尚)
和泓服务(06093.HK)年度净利5635.7万元 每股基本盈利为12.76分
青藏联网工程安全运行十周年 创造直接社会经济效益14.57亿元
牵手阿联酋阿布扎比港 山东港口的全球友好港“朋友圈”扩大到38个
帅丰电器(605336.SH)拟推176.25万股限制性股票激励计划 授予价格为13.62元/股