通常情况下我们都这样这样取分页数据
SELECT SQL_NO_CACHE * FROM erp_orders ORDER BY id LIMIT 300000,10;
一般情况下,ORM生成的就是这种语句。
无论排序字段有没有索引都有严重的性能问题,因为高偏移量会让服务器花费更多的时间来扫描被丢掉的数据。
可以这样:
先取出主键数据,再取出需要列的数据
SELECT SQL_NO_CACHE * FROM erp_orders o INNER JOIN(SELECT id FROM erp_orders ORDER BY id LIMIT 300000,10) AS t ON o.id=t.id;
实例测试
erp_orders 表 38万数据
一、通常做法
SELECT SQL_NO_CACHE * FROM erp_orders ORDER BY id LIMIT 300000,10;
需要约2.169s
二、优化分页
SELECT SQL_NO_CACHE * FROM erp_orders o INNER JOIN(SELECT id FROM erp_orders ORDER BY id LIMIT 300000,10) AS t ON o.id=t.id;
用时0.077s