其實在咱們的工做中相似,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