LIMIT查询优化
如果从结果集中只需要指定数量的行,请LIMIT
在查询中使用子句,而不是获取整个结果集并丢弃多余的数据。
MySQL有时会优化具有子句和无 子句的查询: LIMIT *
row_count*``HAVING
-
如果您仅通过选择几行
LIMIT
,则在某些情况下,MySQL有时会使用索引,而通常情况下,它希望进行全表扫描。 -
如果与结合使用 ,MySQL会在找到排序结果的第一行后立即停止排序 ,而不是对整个结果进行排序。如果通过使用索引进行排序,这将非常快。如果必须执行文件排序,则在找到第一个之前,将选择所有与查询匹配的不带子句的行,并对其中的大多数或全部进行排序 。找到初始行后,MySQL不会对结果集的其余部分进行排序。
LIMIT *
row_count*``ORDER BY
row_count
LIMIT
row_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()
。请参见 第12.16节“信息功能”。 -
LIMIT 0
快速返回一个空集。这对于检查查询的有效性很有用。它也可以用来获取使用MySQL API的应用程序中结果列元数据的类型,这些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 |
+----+----------+--------+
更多内容欢迎关注我的个人公众号“韩哥有话说”,100G人工智能学习资料,大量后端学习资料等你来拿。