正如题目所问。
其实不一样的。这是 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语句。
当使用索引来执行 ORDER BY 子句时,MySQL 能够利用已经排好序的索引树,从而快速找到所需的前 N 行数据,而无需对整个表进行全表扫描和排序。
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;