在開發過程當中,相信你們都遇到過度頁,幾萬條數據時分頁可能沒什麼,加入有上千萬或上億條時,問題就隨之而來。廢話很少說,加入有會員表 members,前端
select * from members where uid = 10000 and is_disable = 0 order by uid asc limit 150000, 100;這條sql你們應該很熟悉,MySQL 執行此類SQL時須要先掃描到150000行,而後再去取 100行。對於此類操做,取前面少數幾行數據會很快,可是掃描的記錄數越多,SQL的性能就會越差,由於150000越大,MySQL須要掃描越多的數據來定位到具體的150000行,這樣耗費大量的IO 成本和時間成本。海量數據狀況下,就算加了索引也會很慢,那麼有什麼辦法優化呢?sql
針對Limit優化方法:1 前端加緩存,減小落到數據庫的查詢.2 優化SQL 訪問數據的方式,直接快速定位到要訪問的數據行 3 記錄上次查詢最新/大的id值。數據庫
第一種方式不用多說,直接說第二種方式,快速定位利用延遲關聯的方式,以下:緩存
優化前:select * from members as m where uid = 10000 and is_disable = 0 and reg_time >='2014-05-29' order by uid asc limit 150000, 100;性能
優化後: select m.* from members as m,(select id from members where uid = 10000 and is_disable = 0 and reg_time >='2014-05-29' order by uid asc limit 150000, 100) as bm where m.id = bm.id;優化
經過使用覆蓋索引查詢返回須要的主鍵,再根據主鍵關聯原表得到須要的數據,而不是經過二級索引獲取主鍵再經過主鍵去遍歷數據頁。ui
第三種方式優化:索引 kid(kid,type)索引
首先要獲取複合條件的記錄的最大 id和最小id(默認id是主鍵):select max(id) as maxid ,min(id) as minid from t where kid=2333 and type=1;開發
其次 根據id 大於最小值或者小於最大值 進行遍歷。it
select xx,xx from t where kid=2333 and type=1 and id >=min_id order by id asc limit 100;
select xx,xx from t where kid=2333 and type=1 and id <=max_id order by id desc limit 100;
附加:優化分頁有多種,這裏僅僅說了兩種,其餘方式例如,限制分頁數,不容許查詢靠後的數據。或者查詢下一頁時把上一頁的id傳給下一頁(相似第三種方式)等