# 深度分页分析 (继续...)

+ `LIMIT M, N`
  + `M`:返回记录行的偏移量（OFFSET）
  + `N`:返回行的最大数量

------------------------------------------------------------
我们发现当 LIMIT 的 offset 越大，SQL 执行时间越长，分别查看下执行计划：

（略）

通过执行计划可以看到，当 LIMIT 50000000,10时候， 优化器估算索引扫描了 50000010 行，扫描这么大量的数据，执行慢也就解释的通了。为什么 LIMIT 50000000,10会扫描这么多数据呢， 这里简单说明下 LIMIT M,N，第一个参数 M 是返回记录行的偏移量（OFFSET），第二个参数 N 是返回行的最大数量，如果只给定一个参数，表示返回的最大行数，等价于 M 为 0。LIMIT M,N 就是根据指定的顺序，逐行扫描并跳过 M（OFFSET） 行数据后，再取最多 N 行数据。

我们上面的例子 LIMIT 50000000,10 中 OFFSET 为 50000000，那 TiKV 就需要扫描 50000010 条数据返回给 TiDB 层，根据主键 ID 排序，所以使用的是主键索引（有序），TiDB 获取到数据然后逐行跳过 50000000 条记录后，取之后的 10 条记录。这就是为什么 OFFSET 比较大时，SQL 执行很慢的原因了，首先 TiKV 层需要返回大量的数据给 TiDB，然后 TiDB 还需要扫描并跳过大量的数据后，最后仅仅取了需要的 10 条记录，从这个 SQL 来看，取 10 条数据的成本真的是太高了，那我们应该怎么解决这个问题呢？思路就是尽量避免 OFFSET 或者 避免大量数据的 OFFSET。
