在MySQL中的需要分页操作我们会使用limit
关键字加上偏移量来实现。但实际上limit 10000, 10
分页关键字的实际原理是,查询出10000 + 10行数据后,舍弃前面的10000行数据,然后取最后的10行数据。
对于一条普通的LIMIT语句,MySQL执行流程是这样的:
- 会在二级索引树中去找出过滤出10010行数据。
- 然后根据这10010行数据去聚集索引树中找到这10010行数据的取出(回表)。
- 舍弃前10000万数据返回,取后10行数据返回(舍弃)。
而要想优化这种分页查询,我们会尽可能的使用覆盖索引扫描 + 延迟关联来解决,具体的SQL语句就是:
SELECT * FROM `audit` INNER JOIN
(SELECT id FROM `audit` ORDER BY `create_time` LIMIT 10000, 10) AS lim
USING(id);
使用子索引先找出满足条件的数据的ID,再通过INNER JOIN进行关联后,通过关联的ID从聚集索引树中返回数据。