请问,limit分页怎样使性能优化?我们需要做一些优化
是不是觉得一条sql跑的性能不理想?见下图:
看到这里我已经心中有数了,select xxx limit a,b; 这是 分页功能开发 最常用的手段了,然而像这种偏移量特别大的时候,MySQL是吃不消的。
##先看下SQL里面这个limit分页的原理
select xxx order by a limit 100,10;
这个sql的意思是根据a字段排序取出第101条至110条,但并不是直接从100条开始往后取,而是取出110条,返回最后10条
由此可见随着起始位置的增大,性能肯定是越来越差的,这是不合理的。
##那么问题来了,如何解决?
简单,别在数据库层做分页就行,这就是最好的方法,特别是有模糊查询的时候,把排序算法交给Lucene这种第三方来做,不要让MySQL做他不擅长的事情。
###你觉得第三方太麻烦,就是想用MySQL来做分页,怎么办?
No Problem,我的思路是尽可能减少扫描的记录数,也就是 先确定起始的范围,再往后取N条记录。
-- id字段是test表的主键,我们用子查询先走主键定位到所需要的起始位置,再去取数据,类似下面sql
SELECT * FROM test WHERE id >= ( SELECT sql_no_cache id FROM test LIMIT 80000,1 ) LIMIT 10 ;
当然也有其他类似的方法,举一反三即可。