图片来自PexelsPhenomenaandProblems通过ORDERBY排序后,使用LIMIT获取前几项,发现返回结果集的顺序和预期的不一样。下面是我遇到的问题:可以看到,带LIMIT和不带LIMIT的结果和我预想的不一样,“难以置信”,真是百思不得其解。后来百度了一下。如果orderbycolumn具有相同的值,MySQL将随机选择这些行。为了保证每次返回的顺序相同,可以增加一个排序字段(如:id),两个字段实现取值相同。潜在地减少重复的机会。于是,改成orderbystatus,id:问题虽然解决了,还是看看官方文档是怎么说的吧!LIMIT查询优化取自“LIMIT查询优化”如果您只需要结果集中指定行数,那么在您的查询中使用LIMIT子句而不是获取整个结果集并丢弃您不需要的其余数据不想。MySQL有时会对包含LIMIT子句而没有HAVING子句的查询进行优化:①MySQL通常更愿意进行全表扫描,但如果使用LIMIT只查询几行,MySQL在某些情况下可能会使用索引。②如果将LIMITrow_count子句与ORDERBY子句结合使用,MySQL会在找到排序结果的第一个row_count行后立即停止排序,而不是对整个结果进行排序。如果使用索引完成排序,这是非常快的。如果必须执行文件排序,则选择除LIMIT子句之外与查询匹配的所有行,并对其中的大部分或全部进行排序,直到找到第一个row_count行。一旦找到第一个row_count,MySQL将不会对结果集中的任何剩余部分进行排序。这种行为的一种表现是带有或不带有LIMIT的ORDERBY查询可能会以不同的顺序返回行。③如果LIMITrow_count和DISTINCT一起使用,MySQL会在找到唯一的row_count行时停止。④LIMIT0可以快速返回空结果集,这是检测查询是否有效的有用方法。⑤如果服务器使用临时表来解析查询,它会使用LIMITrow_count子句来计算需要多少空间。⑥如果ORDERBY不使用索引,后面跟着LIMIT,那么优化器可能可以避免使用合并文件,而是使用内存中的filesort操作对内存中的行进行排序。⑦如果ORDERBY列有多个具有相同值的行,服务器可以自由地以任何顺序返回这些行,并且可能根据整体执行计划而有所不同。换句话说,行的排序顺序对于无序是不确定的。影响执行计划的一个因素是LIMIT,因此对于ORDERBY查询,使用和不使用LIMIT返回的行的顺序可能不同。请参见下面的示例:包括LIMIT可能会影响每个类别行的顺序。例如:如果您需要确保它们以相同的顺序返回,有或没有LIMIT,那么您可以在ORDERBY中包含其他列以使顺序具有??确定性。例如:Summary如果只需要结果集中的几行,建议使用limit。这样您就可以避免获取整个结果集然后丢弃不需要的行。对于orderby查询,返回的行的顺序可能会有所不同,有或没有限制。如果limitrow_count和orderby一起使用,那么找到第一个row_count就停止排序,直接返回。如果orderbycolumn具有相同的值,则MySQL可以自由地以任何顺序返回行。也就是说,只要orderbycolumn的值不重复,返回的顺序是有保证的。可以在orderby子句中包含其他列以使顺序具有??确定性。参考文档:https://dev.mysql.com/doc/refman/5.7/en/limit-optimization.htmlhttps://dev.mysql.com/doc/refman/5.7/en/https://dev。mysql.com/doc/作者:废哥编辑:陶家龙来源:cnblogs.com/cjsblog/p/10874938.html
