当前位置: 首页 > 科技观察

记住!不要在MySQL中同时使用ORDERBY和IMIT,有大坑

时间:2023-03-21 22:16:17 科技观察

和问题。通过ORDERBY排序后,使用LIMIT获取前几项,发现返回结果集的顺序和预期的不一样。下面是我遇到的问题:可以看到有LIMIT和没有LIMIT的结果和我预想的不一样,“难以置信”,真是百思不得其解。后来百度了一下。如果orderbycolumn有相同的值,mysql会随机选择这些行。为了保证每次返回的顺序一致,可以增加一个额外的排序字段(如:id),使用两个字段可以最大限度地减少重复的机会。因此,将其更改为按状态,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中包含其他列以使顺序具有??确定性。例如:Summary1.如果只需要结果集中的几行,建议使用limit。这样您就可以避免获取整个结果集然后丢弃不需要的行。2.对于orderbyquery,返回行的顺序可能不一样,有限制也有没有限制。3.如果limitrow_count和orderby一起使用,那么找到第一个row_count就停止排序,直接返回。4.如果orderbycolumn有相同的值,那么MySQL可以自由地以任何顺序返回行。也就是说,只要orderbycolumn的值不重复,就可以保证返回的顺序。5.您可以在orderby子句中包含额外的列以使顺序具有??确定性。