MySQL · 单选题 · 第 36 题
Java 后端开发面试 · 第 36 题
SELECT … ORDER BY id LIMIT 1000000, 10 很慢,比较有效的优化是?
- A只要把 innodb_buffer_pool_size 调大到足够大,深分页的问题就会被彻底解决
- B用上一页最后一条的 id 做条件(WHERE id > ? LIMIT 10),或先查主键再关联
- C把 LIMIT 1000000, 10 改写成 LIMIT 10 OFFSET 1000000,执行效率就会明显提高很多
- D去掉 ORDER BY 子句就能避免扫描前面的一百万行,同时还能保证结果顺序正确
答案
B B. 用上一页最后一条的 id 做条件(WHERE id > ? LIMIT 10),或先查主键再关联
解析
深分页慢,是因为 MySQL 要先读出并丢弃前一百万行,回表的代价尤其大。基于游标的分页可以直接从索引定位;延迟关联先在覆盖索引上拿到 10 个主键,再回表取整行。OFFSET 写法只是语法不同,执行计划一样;去掉 ORDER BY 后结果顺序没有保证。