offset与limit方法
全表扫描
,如果数据量大,效率慢。
例如OFFSET 是 8 千万,那么它需要获取所有这些记录 (包括那么多根本不需要的数据),将它们放入内存,然后获取 LIMIT 指定的 10 条结果
1 | select * from table_name limit 10 offset 8000001; |
基于游标
因为通过显式告知数据库最新行,数据库就确切地知道从哪里开始搜索(基于有效的索引),而不需要考虑目标范围之外的记录。
1 | select * from table_name where id >8000000 limit 10; |
要使用这种基于游标的分页,需要有一个惟一的序列字段 (或多个),比如惟一的整数 ID 或时间戳,但在某些特定情况下可能无法满足这个条件