• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • LIMIT查询优化

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

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

    • 如果仅使用来选择几行LIMIT,则在通常情况下,MySQL倾向于使用全表扫描,因此在某些情况下会使用索引。
    • 如果与结合使用,MySQL会在找到排序结果的第一行后立即停止排序,而不是对整个结果进行排序。如果通过使用索引进行排序,这将非常快。如果必须执行文件排序,则在找到第一个之前,将选择所有与查询匹配的不带子句的行,并对其中的大多数或全部进行排序。找到初始行后,MySQL不会对结果集的其余部分进行排序。LIMIT row_countORDER BYrow_countLIMITrow_count

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

    • 如果与结合使用,MySQL 将在找到唯一行后立即停止。LIMIT row_countDISTINCTrow_count
    • 在某些情况下,GROUP BY可以通过按顺序读取索引(或对索引进行排序),然后计算汇总直到索引值更改来解决a。在这种情况下,不计算任何不必要的值。LIMIT row_countGROUP BY
    • MySQL一旦向客户端发送了所需的行数,它将立即中止查询,除非您正在使用SQL_CALC_FOUND_ROWS。在这种情况下,可以使用检索行数SELECT FOUND_ROWS()。请参见“信息函数”。
    • LIMIT 0快速返回一个空集。这对于检查查询的有效性很有用。它还可以用于获取使用MySQL API的应用程序中结果列元数据的类型的结果列的类型。在mysql客户端程序中,您可以使用该--column-type-info选项显示结果列类型。
    • 如果服务器使用临时表来解析查询,则它将使用该子句来计算所需的空间。LIMIT row_count
    • 如果未使用索引,ORDER BYLIMIT也存在子句,则优化程序可以避免使用合并文件,并使用内存中filesort操作对内存中的行进行排序。

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

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

    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 	|
    +----	+----------	+--------	+