MySQL深分頁問題四種方案小結(jié)
mysql深分頁問題:
這個問題在實際項目中很常見,當數(shù)據(jù)量大以后,分頁會非常的慢(幾年前做過一個調(diào)度日志的分頁查詢,簡直沒法用)
深分頁為什么慢
前言:N個條件為索引,id為主鍵
平常分頁一般也是用的PageHelper插件,最終SQL就大致長這個樣:
select id,name from table_name where N個條件 limit 100000,10;
它的執(zhí)行流程:
- 先去二級索引過濾數(shù)據(jù),然后找到主鍵ID
- 通過ID回表查詢數(shù)據(jù),取出需要的列
- 掃描滿足條件的100010,丟棄前面100000條,返回
這里很明顯的不足就是,明明只需要拿10條,確多回表了100000次
優(yōu)化
1. 通過子查詢優(yōu)化
優(yōu)化回表次數(shù)
select id,name FROM table_name t1 where id >= (select id from table_name where update_time >= '2024-04-01 23:59:59' limit 100000, 1) AND update_time >= '2024-04-01 23:59:59' LIMIT 10;
流程:根據(jù)條件在二級索引進行匹配,得出結(jié)果ID后,外層查詢再根據(jù)結(jié)果ID向后查10個即可
2. 通過 INNER JOIN 優(yōu)化
優(yōu)化回表次數(shù)
SELECT t1.id,t1.name FROM table_name t1 INNER JOIN (SELECT t2.id FROM table_name t2 WHERE t2.update_time >= '2024-04-01 23:59:59' ORDER BY t2.update_time LIMIT 100000, 10) AS t3 on t1.id= t3.id;
上面兩種方式其核心點都是 優(yōu)化回表次數(shù) 這個角度去進行優(yōu)化,但是掃描的行卻并沒有減少,下面有兩種是從減少掃描行入手的方式,不過都有一定限制
3. 標簽記錄法
記錄上次查詢的最大ID,再請求下一頁的時候
select id,name FROM table_name where id > 100000 order by id limit 10;
4. between...and...
select id,name FROM table_name where id between 100000 and 100010 order by id;
局限性:依賴于連續(xù)自增的字段(如果不連續(xù),可以order by 一下 )
補充
是否可帶條件 | 適用場景 | |
子查詢 | 是 | 后臺系統(tǒng)多條件分頁 |
INNER JOIN | 是 | 后臺系統(tǒng)多條件分頁 |
標簽記錄法 | 否 | 滑動分頁(如app商品列表、新聞資訊列表) |
between...and... | 否 | 滑動分頁 |
之前在項目后臺管理系統(tǒng)中采用的 標簽記錄法,根據(jù)條件快速定位到ID,然后再次根據(jù)條件向后掃描指定行數(shù),前端也一并改造,禁止輸入頁數(shù),僅允許點擊下一頁上一頁[既然都出現(xiàn)深分頁問題了,那業(yè)務也不需要支持使用者隨意跳頁,因為沒有任何意義,他要跳到八千五百三十一頁看什么呢?]
到此這篇關于MySQL深分頁問題四種方案小結(jié)的文章就介紹到這了,更多相關MySQL深分頁內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
MySQL高效模糊搜索之內(nèi)置函數(shù)locate instr position find_in_set使用詳解
在MySQL中一般進行模糊搜索都是使用LIKE配合通配符進行查詢的,在性能上一定的影響,下面給大家分享MYSQL自帶的內(nèi)置模糊搜索函數(shù),除最后一個外其它三個性能上要比Like快些2018-09-09Linux下安裝mysql-5.6.12-linux-glibc2.5-x86_64.tar.gz
這篇文章主要介紹了Linux下安裝mysql-5.6.12-linux-glibc2.5-x86_64.tar.gz的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-09-09詳解MySQL?substring()?字符串截取函數(shù)
MySQL 查詢數(shù)據(jù)有時候需要對數(shù)據(jù)項進行日期格式化或截取特定部分的操作,當需要對字符串進行截取加工時用到了 substring() 函數(shù),這篇文章主要介紹了MySQL?substring()?字符串截取函數(shù),需要的朋友可以參考下2022-07-07mysql?8.0.29?winx64.zip安裝配置方法圖文教程
這篇文章主要為大家詳細介紹了mysql?8.0.29?winx64.zip安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-06-06MySQL數(shù)據(jù)庫對敏感數(shù)據(jù)加密及解密的實現(xiàn)方式
這篇文章主要介紹了MySQL數(shù)據(jù)庫對敏感數(shù)據(jù)加密及解密的實現(xiàn)方式,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值 ,需要的朋友可以參考下2020-03-03