mysql语句order和limit_MySQL中ORDER BY与LIMIT一起使用的坑

LIMIT查询优化

如果从结果集中只需要指定数量的行,请LIMIT在查询中使用子句,而不是获取整个结果集并丢弃多余的数据。

MySQL有时会优化具有子句和无 子句的查询: LIMIT row_count HAVING

如果您仅通过选择几行 LIMIT,则在某些情况下,MySQL有时会使用索引,而通常情况下,它希望进行全表扫描。

如果与结合使用 ,MySQL会在找到排序结果的第一行后立即停止排序 ,而不是对整个结果进行排序。如果通过使用索引进行排序,这将非常快。如果必须完成文件排序,则在找到第一个之前,将选择所有与查询匹配的不带子句的行,并对其中的大多数或全部进行排序 。找到初始行后,MySQL不会对结果集的其余部分进行排序。 LIMIT row_count ORDER BY row_countLIMITrow_count

此行为的一种体现是,ORDER BY带有和不带有 查询的查询 LIMIT可能以不同的顺序返回行,如后面所述。

如果与结合使用,MySQL将在 找到唯一行后立即停止。 LIMIT row_count DISTINCT row_count

在某些情况下,GROUP BY可以通过按顺序读取索引(或对索引进行排序),然后计算汇总直到索引值更改来解决a。在这种情况下,不计算任何不必要的 值。 LIMIT row_count GROUP BY

MySQL一旦将所需的行数发送到客户端,它将立即中止查询,除非您正在使用 SQL_CALC_FOUND_ROWS。在这种情况下,可以使用检索行数SELECT FOUND_ROWS()。

LIMIT 0快速返回一个空集。这对于检查查询的有效性很有用。它还可以用于获取使用MySQL API的应用程序中结果列元数据的类型的结果列的类型。在 mysql客户端程序中,您可以使用该 --column-type-info选项显示结果列类型。

如果服务器使用临时表来解析查询,则它将使用该子句来计算所需的空间。 LIMIT row_count

如果未使用索引,ORDER BY 但LIMIT也存在子句,则优化器可能能够避免使用合并文件,并使用内存中filesort操作对内存中的行进行排序 。

如果多行在列中具有相同的值ORDER BY,则服务器可以自由以任何顺序返回这些行,并且根据整体执行计划,这样做的方式可能有所不同。换句话说,这些行的排序顺序相对于无序列是不确定的。

影响执行计划的一个因素是 LIMIT,因此ORDER BY 带有和不带有查询的查询LIMIT可能以不同顺序返回行。考虑以下查询,该查询按category列排序,但对于id和 rating列不确定:

mysql> SELECT * FROM ratings ORDER BY category;

+----+----------+--------+

| id | category | rating |

+----+----------+--------+

| 1 | 1 | 4.5 |

| 5 | 1 | 3.2 |

| 3 | 2 | 3.7 |

| 4 | 2 | 3.5 |

| 6 | 2 | 3.5 |

| 2 | 3 | 5.0 |

| 7 | 3 | 2.7 |

+----+----------+--------+

包含LIMIT可能会影响每个category值中的行顺序。例如,这是一个有效的查询结果:

mysql> SELECT * FROM ratings ORDER BY category LIMIT 5;

+----+----------+--------+

| id | category | rating |

+----+----------+--------+

| 1 | 1 | 4.5 |

| 5 | 1 | 3.2 |

| 4 | 2 | 3.5 |

| 3 | 2 | 3.7 |

| 6 | 2 | 3.5 |

+----+----------+--------+

在每种情况下,行均按ORDER BY列排序,这是SQL标准所需的全部。

如果重要的是要确保带有和不带有的行顺序相同LIMIT,则在ORDER BY子句中包括其他列以使顺序确定。例如,如果id值是唯一的,则可以通过如下排序使给定category值的行 按id顺序显示 :

mysql> SELECT * FROM ratings ORDER BY category, id;

+----+----------+--------+

| id | category | rating |

+----+----------+--------+

| 1 | 1 | 4.5 |

| 5 | 1 | 3.2 |

| 3 | 2 | 3.7 |

| 4 | 2 | 3.5 |

| 6 | 2 | 3.5 |

| 2 | 3 | 5.0 |

| 7 | 3 | 2.7 |

+----+----------+--------+

mysql> SELECT * FROM ratings ORDER BY category, id LIMIT 5;

+----+----------+--------+

| id | category | rating |

+----+----------+--------+

| 1 | 1 | 4.5 |

| 5 | 1 | 3.2 |

| 3 | 2 | 3.7 |

| 4 | 2 | 3.5 |

| 6 | 2 | 3.5 |

+----+----------+--------+`

总结:

1、如果你只需要结果集中的某几行,那么建议使用limit。这样这样的话可以避免抓取全部结果集,然后再丢弃那些你不要的行。

2、对于order by查询,带或者不带limit可能返回行的顺序是不一样的。

3、如果limit row_count 与 order by 一起使用,那么在找到第一个row_count就停止排序,直接返回。

4、如果order by列有相同的值,那么MySQL可以自由地以任何顺序返回这些行。换言之,只要order by列的值不重复,就可以保证返回的顺序。

5、可以在order by子句中包含附加列,以使顺序具有确定性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值