正如题目所问。
其实不一样的。这是 MySQL 中典型的深度分页问题。
MySQL 的LIMIT m n
工作原理是先读取前 m+n 条记录,再抛弃前 m 条,然后返回后面的 n 条数据。因此,当 m 值增大时,偏移量也增大,性能表现就会变差。
因此,LIMIT 10000000,100
要比LIMIT 0,100
的性能差得多,因为它需要先读取 10000100 条数据,然后再抛弃前 10000000 条。
limit 优化
通常,在查询数据时,如果已经明确知道所需行数,建议在查询语句中使用LIMIT
,而不是先检索整个结果集再丢弃不需要的数据。
尽管我们前面提到,在深度分页时,MySQL 也会先检索全部数据再丢弃,但 MySQL 对LIMIT
也进行了一些优化。然而,以下优化前提假设在使用LIMIT
时没有使用HAVING
语句。
MySQL 通常更倾向于执行全表扫描,但如果您使用 LIMIT
只查询少量记录,MySQL 在某些情况下可能会选择使用索引。如果将 LIMIT
子句与ORDER BY
子句结合使用,MySQL 会在找到排序结果的前 row_count 行数据后立即停止排序,而不是对整个结果进行排序。如果使用索引完成排序,这将非常快。
★当使用索引来执行 ORDER BY 子句时,MySQL 能够利用已经排好序的索引树,从而快速找到所需的前 N 行数据,而无需对整个表进行全表扫描和排序。
当将 LIMIT row_count
与DISTINCT
一起使用时,一旦找到 row_count 个唯一的行,MySQL 就会停止。使用 LIMIT 0
可以快速返回一个空的结果集,这是一种很有用的方法,用于检测查询是否有效。如果 ORDER BY
不适用索引,并且后面还有LIMIT
子句,优化器可能会避免使用合并文件,而是使用内存中的filesort
操作对内存中的行进行排序。
limit 和 order by
我们都知道,在查询过程中,如果对某个字段进行排序(ORDER BY
),而该字段存在重复值,MySQL 可能以任意顺序返回这些行记录,并且根据执行计划的不同,排序结果可能会有所不同。换句话说,排序结果可能是不确定的。
因此,当ORDER BY
语句中有LIMIT
时,每次查询结果都可能不同。例如,下面两次查询的结果可能会有所不同:
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 |
+----+----------+--------+
那么,解决这个问题的一个好方法就是在排序时不仅使用一个字段,而是再加一个字段,比如像 id 这样保证不会重复的字段。
mysql> SELECT * FROM ratings ORDER BY category,id LIMIT 5;
好了,本章节到此告一段落。希望对你有所帮助,祝学习顺利。

文章转载自码上遇见你,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




