知识卡片
offset分页的真实代价
内容
limit offset,10看似只取10条,实际数据库要先遍历offset条记录才能定位起点,完全没用上索引定位能力。合理做法是把offset换算成上一页最后一条记录的max_id,用where id>max_id limit 10代替,直接跳过前面所有记录。发散:”数多少个位置”与”记住上次停在哪”性能可差数量级,这是游标分页优于页码分页的根本原因。
参考来源
- 位置:第6章《数据库》6.3节「B+树索引」offset分页相关小节(源文件:_epub-src/text/part0027.html)
- 结论依据:原文明确说明offset分页用不到索引,即使只取10条数据库也要遍历前面所有记录才能定位offset位置,合理办法是把offset换算成max_id用where子句实现,直接支持卡片对offset分页真实代价及游标分页替代方案的论述。
- 原始内容:"对于offset这种特性,其实是用不到索引的……虽然只取了10条数据,但实际上数据库要把前面的1000条数据都遍历才能知道offset=1000的位置在哪。对于这种情况,合理的办法是不要用offset,而是把offset=1000的位置换算成某个max_id。"