mysql分頁時offset過大的Sql優(yōu)化實例分享

當(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ù)

MySQL優(yōu)化總結(jié)-查詢總條數(shù)

MySQL優(yōu)化總結(jié)-查詢總條數(shù)

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊9 分享