在 MySQL 中,以块为单位查询整个表的最有效方法是什么?

Jor*_*Day 2 mysql performance limits paging

如果我有一张桌子User,做这样的事情会更快:

SELECT * FROM user WHERE id > ? ORDER BY id LIMIT 10000

(每个后续查询都使用前最后一行的 id 作为参数)

或者使用带有偏移量的 LIMIT,如下所示:

SELECT * FROM user ORDER BY id LIMIT ?, 10000

(到目前为止检索到的记录总数是偏移量)。

作为一个额外的复杂因素,如果我想基于链接表连接执行类似的查询怎么办?就像说一个user可以属于多个角色,所以我想要一个查询

SELECT u.* FROM user u INNER JOIN user_roles ur ON ur.user_id = u.id WHERE ur.role_name IN ('Admin', 'SuperUser', 'etc.') LIMIT ?, 10000

连接是否会影响关于首选哪种样式查询的决定?

Ric*_*mes 8

OFFSET非常糟糕的。不是在 Order(N) 时间内处理数据,而是需要 Order(N*N)。这是因为努力跳过“偏移”行。

而是“记住你离开的地方”。我在这两个博客中详细介绍了此类内容:

这些技巧适用于所有版本的 MySQL。