# Mysql Limit 限制

MySQL使用 limit 分页, m是偏移量,n是要查询的数量。

当偏移量m过大的时候,查询效率会很低。因为MySQL是先查出m+n个数据,然后抛弃掉前m个数据。

limit m,n

m+n 次回表操作,优化成 n 次回表操作。

# 优化示例

SELECT * FROM t ORDER BY key1 LIMIT 1;
SELECT * FROM t ORDER BY key1 LIMIT 5000, 1;

key1 加了索引,在 Limit 5000,1 的时候可能不会使用索引而全表扫描差。

MySQL内部其实是分为 server 层和存储引擎层的:

limit 的处理事放在了 server 层处理,当存储引擎把数据返回之后,server 层在判断这个数据是不是在 limit 中。

因此实际上是查询了 5001 条数据,然后只把 5001 这一条数据返回给客户端了。

但是这 5000 条数据,从普通索引到回表也发生了 5000 次。

为了减少回表次数,可以通过子查询获得 id,这个 id 只查询索引树就可以得到。这个语句就只发生了一次回表。

SELECT * FROM t, (SELECT id FROM t ORDER BY key1 LIMIT 5000, 1) AS d
    WHERE t.id = d.id;