當(dāng)我們展示一個列表中的內(nèi)容時,難免會遇到分頁問題,因為列表中的內(nèi)容數(shù)量可能很多,但是用戶能一次看到的界面大小是有限的,不可能一個界面展示所有的內(nèi)容,從后端一次性取太多的數(shù)據(jù)也會給后端造成額外的壓力。mysql分頁是我們在開發(fā)經(jīng)常遇到的一個功能,最近在實現(xiàn)該功能的時候遇到一個問題,所以這篇文章主要給大家介紹了關(guān)于mysql分頁時offset過大的sql優(yōu)化經(jīng)驗,文中介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編來一起看看吧。
通常分頁查詢的時候會使用這樣的語句:
SELECT * FROM?table where?condition1?=?0 and?condition2?=?0 and?condition3?=?-1 and?condition4?=?-1 order?by?id?asc LIMIT?2000?OFFSET?50000
當(dāng)offset特別大時,這條語句的執(zhí)行效率會明顯減低,而且效率是隨著offset的增大而降低的。
原因為:
MySQL并不是跳過offset行,而是取offset+N行,然后返回放棄前offset行,返回N行,當(dāng)offset特別大,然后單條數(shù)據(jù)也很大的時候,每次查詢需要獲取的數(shù)據(jù)就越多,自然就會很慢。
優(yōu)化方案:
SELECT * FROM?table JOIN (select?id?from?table where?condition1?=?0 and?condition2?=?0 and?condition3?=?-1 and?condition4?=?-1 order?by?id?asc LIMIT?2000?OFFSET?50000) as?tmp?using(id)
或者
SELECT?a.*?FROM?table?a,? (select?id?from?table where?condition1?=?0 and?condition2?=?0 and?condition3?=?-1 and?condition4?=?-1 order?by?id?asc LIMIT?2000?OFFSET?50000)?b? where?a.id?=?b.id
先獲取主鍵列表,再通過主鍵查詢目標(biāo)數(shù)據(jù),即使offset很大,也是獲取了很多的主鍵,而不是所有的字段數(shù)據(jù),相對而言效率會提升很多。
相關(guān)推薦:
MySQL優(yōu)化總結(jié)-查詢總條數(shù)
? 版權(quán)聲明
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載。
THE END