通常針對mysql大資料量的查詢採取「分頁」策略,但是如果翻頁到比較靠後的位置時查詢將變得很慢,因為mysql將花費大量的時間來掃瞄需要丟棄的資料。
通常情況下,為了實現高效分頁,需要在查詢中where條件列和排序列應用組合索引。
例如,建立索引(a,b,c)使得以下查詢可以使用索引,提高查詢效率:
1、字段排序
order
by a
order
by a,b
order
by a, b, c
order
by a desc, b desc, c desc
2、篩選和排序
where a = const order by b, c
where a = const and b = const order by c
where a = const order by b, c
where a = const and b > const order by b, c
3、下面查詢是無法使用以上索引的
order
by a asc, b desc, c desc
//排序方向不一致
where g = const
order
by b, c // 欄位g不是索引一部分
where a = const
order
by c //沒有使用欄位b
where a = const
order
by a, d // 欄位d不是索引的一部分
1、將limit m,n的查詢改為limit n
產品實際使用過程中使用者很少關心搜尋結果的第1萬條資料。
3、使用延遲關聯
通過使用覆蓋索引來查詢返回需要的主鍵,再根據返回的主鍵關聯原表獲得需要的行,這樣可以減少mysql掃瞄那些需要丟棄的行數。
例項:
使用索引(***,rating)進行查詢:
mysql> select
from profiles inner join (
-> select
key cols> from profiles
-> where x.***='m' order by rating limit 100000, 10
-> ) as x using(key cols>);
高效的MySQL分頁
size large percona performance conference 2009上,來自雅虎的幾位工程師帶來了一篇 efficient pagination using mysql 的報告,有很多亮點,本文是在原文基礎上的進一步延伸。首先看一下分頁的基本原理 mysql explain ...
構建高效的MySQL分頁
mysql分頁的主要目的就是提公升效率,今天我們將簡單介紹如何構建高效mysql分頁。首先看一下分頁的基本原理 limit 10000,20的意思掃瞄滿足條件的10020行,扔掉前面的10000行,返回最後的20行,問題就在這裡,如果是limit 100000,100,需要掃瞄100100行,在乙個...
mysql 較為高效的分頁
直接上 daoimpl 開發轉讓頁面展示 查詢搜尋資料,並且分頁展示 param zrdp 搜尋條件封裝物件 return suppresswarnings unchecked public listshowallzrdpxxpageindex zrdpxx zrdp,int pageindex,s...