欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL深分頁問題四種方案小結(jié)

 更新時間:2024年11月04日 11:32:25   作者:北i  
在數(shù)據(jù)量大時,深分頁查詢速度緩慢,主要原因是多次回表查詢,優(yōu)化方法主要介紹了四種,各方法適用于不同場景,本文就來詳細的介紹一下,感興趣的可以了解一下

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存儲引擎InnoDB和Myisam的六大區(qū)別

    Mysql存儲引擎InnoDB和Myisam的六大區(qū)別

    這篇文章主要介紹了Mysql存儲引擎InnoDB和Myisam的六大區(qū)別,本文從構(gòu)成上、事務處理、SQL操作、自動ID、表行數(shù)等方面講解了它的區(qū)別,需要的朋友可以參考下
    2015-02-02
  • MySQL與PHP的基礎與應用專題之數(shù)據(jù)完整性

    MySQL與PHP的基礎與應用專題之數(shù)據(jù)完整性

    MySQL是一個關系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQL?AB?公司開發(fā),屬于?Oracle?旗下產(chǎn)品。MySQL?是最流行的關系型數(shù)據(jù)庫管理系統(tǒng)之一,本系列將帶你掌握php與mysql的基礎應用,本篇從數(shù)據(jù)完整性開始
    2022-02-02
  • mysql開啟binlog步驟講解

    mysql開啟binlog步驟講解

    在本文里我們給大家分享了關于mysql開啟binlog的方法和相關知識點,對此有需要的朋友們跟著學習下。
    2019-03-03
  • Linux下MySQL 5.6.27 安裝教程

    Linux下MySQL 5.6.27 安裝教程

    這篇文章主要為大家詳細介紹了Linux下MySQL 5.6.27 安裝教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • mysql8中如何設置sql-mode

    mysql8中如何設置sql-mode

    這篇文章主要介紹了mysql8中如何設置sql-mode問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • MySQL JSON類型字段的簡單使用

    MySQL JSON類型字段的簡單使用

    JSON作為現(xiàn)在最為流行的數(shù)據(jù)交互形式,在5.7版本開始新增JSON數(shù)據(jù)類型,本文就來介紹一下MySQL JSON類型字段的使用,具有一定的參考價值,感興趣的可以了解一下
    2025-08-08
  • MySQL執(zhí)行SQL文件的常見場景與方法

    MySQL執(zhí)行SQL文件的常見場景與方法

    MySQL?作為世界上最流行的開源關系型數(shù)據(jù)庫管理系統(tǒng),在日常開發(fā)和運維工作中扮演著重要角色,本文主要介紹了MySQL?執(zhí)行?SQL?文件的主要方法與場景,希望對大家有所幫助
    2025-06-06
  • MySQL OOM 系統(tǒng)二 OOM Killer

    MySQL OOM 系統(tǒng)二 OOM Killer

    前面一節(jié)重點分享了Linux的內(nèi)存分配策略,基于上述的分配策略,為了規(guī)避超售的風險,Linux采了一種OOM Killer的機制,即系統(tǒng)可用內(nèi)存(包括Swap)即將使用完之前,選擇性的Kill掉一些進程以求釋放一些內(nèi)存
    2016-07-07
  • MySQL中SQL的執(zhí)行順序詳解

    MySQL中SQL的執(zhí)行順序詳解

    這篇文章主要介紹了MySQL中SQL的執(zhí)行順序,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • MySQL中l(wèi)ower_case_table_names作用及使用小結(jié)

    MySQL中l(wèi)ower_case_table_names作用及使用小結(jié)

    在使用DataEase連接外部數(shù)據(jù)庫時,可能會遇到啟動報錯的問題,官方文檔指出,修改數(shù)據(jù)庫配置文件中的lower_case_table_names=1參數(shù)可以解決此問題,此參數(shù)控制表名大小寫敏感性,感興趣的可以了解一下
    2024-09-09

最新評論