mysql 利用延迟关联优化查询(select * from your_table order by id desc limit 2000000,20)

其实在咱们的工做中相似,select * from your_table order by id desc limit 2000000,20会常常碰见,好比在分页中就很常见。前端

若是咱们的sql中出现这样的查询(好比:点击查看“末页”),那是至关恐怖的(等待时间会很长)。该sql是一个很是典型的排序+分页查询:order by col limit N,OFFSET M, MySQL 执行此类sql时须要先扫描到N行,而后再去取 M行。对于此类大数据量的排序操做,取前面少数几行数据会很快,可是越靠后,sql的性能就会越差,由于N越大,MySQL 须要扫描不须要的数据而后在丢掉,这样耗费大量的时间。sql

【分析】
针对limit 优化有不少种方式,
1 前端加缓存,减小落到库的查询操做
2 优化SQL
3 使用书签方式 ,记录上次查询最新/大的id值,向后追溯 M行记录。
4 使用Sphinx 搜索优化。
对于第二种方式 咱们推荐使用"延迟关联" (deferred join) 的方法来优化排序操做,何谓"延迟关联" :经过使用覆盖索引查询返回须要的主键,再根据主键关联原表得到须要的数据。缓存

【解决】
根据延迟关联的思路,修改SQL 以下:
性能

  select a.* from your_table a,(大数据

                select id from your_table where (这里的where条件根据具体状况具体编写) order by id desc limit 2000000,20优化

                ) b where a.id = b.idspa

相关文章
相关标签/搜索