国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

MySQL 深度分頁

這篇具有很好參考價值的文章主要介紹了MySQL 深度分頁。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。


一、深度分頁

MySQL 深度分頁是指在分頁查詢數(shù)據(jù)量比較大的表時,需要訪問表中的某一段數(shù)據(jù),而這段數(shù)據(jù)的位置非??亢螅枰ㄟ^較大的 offset 來獲取目標(biāo)數(shù)據(jù)。


二、測試數(shù)據(jù)

-- 測試表
drop table if exists wide_table;
create table wide_table
(
    id          bigint auto_increment primary key,
    a           varchar(255),
    b           varchar(255),
    c           varchar(255),
    d           varchar(255),
    e           varchar(255),
    f           varchar(255),
    g           varchar(255),
    h           varchar(255),
    i           varchar(255),
    create_time datetime default current_timestamp
);
-- 插入十萬條記錄
delimiter //

drop procedure if exists insert_data;
create procedure insert_data()
begin
    declare i int default 1;
    while i <= 100000
        do
            insert into wide_table (a, b, c, d, e, f, g, h, i)
            values (i, i, i, i, i, i, i, i, i);
            set i = i + 1;
            if i % 10000 = 0 then
                select i;
            end if;
        end while;
end //

delimiter ;

call insert_data();

三、分頁策略

3.1 默認(rèn)分頁

默認(rèn)分頁即通過 limit #{offset}, #{pageSize}limit #{pageSize} offset #{offset} 來進(jìn)行分頁。二者本質(zhì)上都是全表掃描,MySQL 會依次取出 pageSize 條記錄,然后判斷其是否在 offset 后,如果不在則舍棄,繼續(xù)過濾,所以效率低下。

test> select *
      from wide_table
      limit 80000, 100
[2024-01-18 14:55:42] 在 335 ms (execution: 298 ms, fetching: 37 ms) 內(nèi)檢索到從 1 開始的 100 行
test> select *
      from wide_table
      limit 100 offset 80000
[2024-01-18 14:55:43] 在 282 ms (execution: 233 ms, fetching: 49 ms) 內(nèi)檢索到從 1 開始的 100 行
explain
select *
from wide_table
limit 80000, 100;
# +--+-----------+----------+----------+----+-------------+----+-------+----+-----+--------+-----+
# |id|select_type|table     |partitions|type|possible_keys|key |key_len|ref |rows |filtered|Extra|
# +--+-----------+----------+----------+----+-------------+----+-------+----+-----+--------+-----+
# |1 |SIMPLE     |wide_table|null      |ALL |null         |null|null   |null|99551|100     |null |
# +--+-----------+----------+----------+----+-------------+----+-------+----+-----+--------+-----+

explain
select *
from wide_table
limit 100 offset 80000;
# +--+-----------+----------+----------+----+-------------+----+-------+----+-----+--------+-----+
# |id|select_type|table     |partitions|type|possible_keys|key |key_len|ref |rows |filtered|Extra|
# +--+-----------+----------+----------+----+-------------+----+-------+----+-----+--------+-----+
# |1 |SIMPLE     |wide_table|null      |ALL |null         |null|null   |null|99551|100     |null |
# +--+-----------+----------+----------+----+-------------+----+-------+----+-----+--------+-----+

3.2 索引分頁

索引分頁即通過索引字段(一般選取主鍵)的范圍查詢以及比較操作進(jìn)行分頁,通過應(yīng)用索引能夠大幅縮短查詢時間。

test> select *
      from wide_table
      where id between 80000 and 80100
[2024-01-18 15:02:27] 在 224 ms (execution: 184 ms, fetching: 40 ms) 內(nèi)檢索到從 1 開始的 101 行
test> select *
      from wide_table
      where id > 80000
      limit 100
[2024-01-18 14:58:34] 在 218 ms (execution: 185 ms, fetching: 33 ms) 內(nèi)檢索到從 1 開始的 100 行
explain
select *
from wide_table
where id between 80000 and 80100;
# +--+-----------+----------+----------+-----+-------------+-------+-------+----+----+--------+-----------+
# |id|select_type|table     |partitions|type |possible_keys|key    |key_len|ref |rows|filtered|Extra      |
# +--+-----------+----------+----------+-----+-------------+-------+-------+----+----+--------+-----------+
# |1 |SIMPLE     |wide_table|null      |range|PRIMARY      |PRIMARY|8      |null|101 |100     |Using where|
# +--+-----------+----------+----------+-----+-------------+-------+-------+----+----+--------+-----------+

explain
select *
from wide_table
where id > 80000
limit 100;
# +--+-----------+----------+----------+-----+-------------+-------+-------+----+-----+--------+-----------+
# |id|select_type|table     |partitions|type |possible_keys|key    |key_len|ref |rows |filtered|Extra      |
# +--+-----------+----------+----------+-----+-------------+-------+-------+----+-----+--------+-----------+
# |1 |SIMPLE     |wide_table|null      |range|PRIMARY      |PRIMARY|8      |null|39420|100     |Using where|
# +--+-----------+----------+----------+-----+-------------+-------+-------+----+-----+--------+-----------+

3.3 子查詢

索引分頁的局限性在于待查詢的表必須有一個自增長的主鍵,如果主鍵是 UUID 就無法進(jìn)行索引分頁了,此外在編碼時還需要考慮索引斷裂導(dǎo)致的重復(fù)查詢。

我們也可以通過子查詢來優(yōu)化分頁,即先通過默認(rèn)分頁操作找到限定的主鍵,這個操作能夠利用主鍵索引而且只考慮主鍵這一個字段,因此效率比較高。然后在根據(jù)這個主鍵進(jìn)行條件查詢,從而得到分頁數(shù)據(jù)。

test> select *
      from wide_table
      where id >= (select id from wide_table limit 80000, 1)
      limit 100
[2024-01-18 15:03:34]236 ms (execution: 202 ms, fetching: 34 ms) 內(nèi)檢索到從 1 開始的 100
explain
select *
from wide_table
where id >= (select id from wide_table limit 80000, 1)
limit 100;
# +--+-----------+----------+----------+-----+-------------+-------+-------+----+-----+--------+-----------+
# |id|select_type|table     |partitions|type |possible_keys|key    |key_len|ref |rows |filtered|Extra      |
# +--+-----------+----------+----------+-----+-------------+-------+-------+----+-----+--------+-----------+
# |1 |PRIMARY    |wide_table|null      |range|PRIMARY      |PRIMARY|8      |null|39420|100     |Using where|
# |2 |SUBQUERY   |wide_table|null      |index|null         |PRIMARY|8      |null|99551|100     |Using index|
# +--+-----------+----------+----------+-----+-------------+-------+-------+----+-----+--------+-----------+

3.4 延遲關(guān)聯(lián)

延遲關(guān)聯(lián)主要通過減少回表次數(shù)來提高查詢效率。

分析下面的執(zhí)行計劃:

  • 第三行執(zhí)行計劃 id 最大最先執(zhí)行,這是一個對 wide_table 表的索引掃描,只遍歷索引而無需回表(可以理解為索引覆蓋)。最終查詢到了從第 80001 條記錄開始的 100 條記錄的主鍵,并將這些主鍵保存在臨時表 wt 中。
  • 第一行執(zhí)行計劃對 wt 進(jìn)行了全表掃描,獲取了主鍵的查詢結(jié)果集。
  • 第二行執(zhí)行計劃在 wt 中這 100 條主鍵記錄的基礎(chǔ)上,通過等值連接(延遲關(guān)聯(lián))回表獲取到了最終的分頁結(jié)果。

整個查詢過程中只有最終的 100 條記錄發(fā)生了回表,其余記錄都只查詢了 id 并被過濾掉了,提高了查詢的效率。文章來源地址http://www.zghlxwxcb.cn/news/detail-807462.html

test> select *
      from wide_table
      inner join (select id from wide_table limit 80000, 100) as wt
      on wide_table.id = wt.id
[2024-01-18 15:03:36]241 ms (execution: 207 ms, fetching: 34 ms) 內(nèi)檢索到從 1 開始的 100
explain
select *
from wide_table
inner join (select id from wide_table limit 80000, 100) as wt
on wide_table.id = wt.id;
# +--+-----------+----------+----------+------+-------------+-------+-------+-----+-----+--------+-----------+
# |id|select_type|table     |partitions|type  |possible_keys|key    |key_len|ref  |rows |filtered|Extra      |
# +--+-----------+----------+----------+------+-------------+-------+-------+-----+-----+--------+-----------+
# |1 |PRIMARY    |<derived2>|null      |ALL   |null         |null   |null   |null |80100|100     |null       |
# |1 |PRIMARY    |wide_table|null      |eq_ref|PRIMARY      |PRIMARY|8      |wt.id|1    |100     |null       |
# |2 |DERIVED    |wide_table|null      |index |null         |PRIMARY|8      |null |99551|100     |Using index|
# +--+-----------+----------+----------+------+-------------+-------+-------+-----+-----+--------+-----------+

到了這里,關(guān)于MySQL 深度分頁的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 畢業(yè)設(shè)計:基于python人臉識別考勤系統(tǒng) 簽到系統(tǒng) 深度學(xué)習(xí) Flask框架 Dlib庫 MySQL數(shù)據(jù)庫 大數(shù)據(jù)(源碼+論文)?

    畢業(yè)設(shè)計:基于python人臉識別考勤系統(tǒng) 簽到系統(tǒng) 深度學(xué)習(xí) Flask框架 Dlib庫 MySQL數(shù)據(jù)庫 大數(shù)據(jù)(源碼+論文)?

    畢業(yè)設(shè)計:2023-2024年計算機(jī)專業(yè)畢業(yè)設(shè)計選題匯總(建議收藏) 畢業(yè)設(shè)計:2023-2024年最新最全計算機(jī)專業(yè)畢設(shè)選題推薦匯總 ?? 感興趣的可以先收藏起來,點贊、關(guān)注不迷路,大家在畢設(shè)選題,項目以及論文編寫等相關(guān)問題都可以給我留言咨詢,希望幫助同學(xué)們順利畢業(yè)?。

    2024年02月20日
    瀏覽(22)
  • MySQL百萬數(shù)據(jù)深度分頁優(yōu)化思路分析

    一般在項目開發(fā)中會有很多的統(tǒng)計數(shù)據(jù)需要進(jìn)行上報分析,一般在分析過后會在后臺展示出來給運營和產(chǎn)品進(jìn)行 分頁查看 , 最常見的一種就是根據(jù)日期進(jìn)行篩選 。這種統(tǒng)計數(shù)據(jù)隨著時間的推移數(shù)據(jù)量會慢慢的變大,達(dá)到百萬、千萬條數(shù)據(jù)只是時間問題。 創(chuàng)建了一張user表,

    2024年02月03日
    瀏覽(23)
  • 【性能優(yōu)化】MySQL百萬數(shù)據(jù)深度分頁優(yōu)化思路分析

    【性能優(yōu)化】MySQL百萬數(shù)據(jù)深度分頁優(yōu)化思路分析

    ????????一般在項目開發(fā)中會有很多的統(tǒng)計數(shù)據(jù)需要進(jìn)行上報分析,一般在分析過后會在后臺展示出來給運營和產(chǎn)品進(jìn)行 分頁查看 , 最常見的一種就是根據(jù)日期進(jìn)行篩選 。這種統(tǒng)計數(shù)據(jù)隨著時間的推移數(shù)據(jù)量會慢慢的變大,達(dá)到百萬、千萬條數(shù)據(jù)只是時間問題。 一、數(shù)

    2024年02月15日
    瀏覽(24)
  • 【MySQL 】MySQL 創(chuàng)建數(shù)據(jù)庫, MySQL 刪除數(shù)據(jù)庫,MySQL 選擇數(shù)據(jù)庫

    【MySQL 】MySQL 創(chuàng)建數(shù)據(jù)庫, MySQL 刪除數(shù)據(jù)庫,MySQL 選擇數(shù)據(jù)庫

    作者簡介: 辭七七,目前大一,正在學(xué)習(xí)C/C++,Java,Python等 作者主頁: 七七的個人主頁 文章收錄專欄: 七七的閑談 歡迎大家點贊 ?? 收藏 ? 加關(guān)注哦!???? 我們可以在登陸 MySQL 服務(wù)后,使用 create 命令創(chuàng)建數(shù)據(jù)庫,語法如下: 以下命令簡單的演示了創(chuàng)建數(shù)據(jù)庫的過程,

    2024年02月13日
    瀏覽(114)
  • 【MySQL數(shù)據(jù)庫】初識MySQL數(shù)據(jù)庫、安裝MySQL

    【MySQL數(shù)據(jù)庫】初識MySQL數(shù)據(jù)庫、安裝MySQL

    在今天的數(shù)字化世界中,數(shù)據(jù)是企業(yè)和個人的重要資產(chǎn)。管理和存儲數(shù)據(jù)變得至關(guān)重要,而 MySQL 數(shù)據(jù)庫是一種備受歡迎的開源關(guān)系型數(shù)據(jù)庫管理系統(tǒng),它提供了穩(wěn)定、可靠、高性能的數(shù)據(jù)存儲解決方案。本文將介紹 MySQL 數(shù)據(jù)庫的基本概念和安裝過程,以便初學(xué)者能夠輕松上

    2024年02月08日
    瀏覽(23)
  • 初識MySQL數(shù)據(jù)庫——“MySQL數(shù)據(jù)庫”

    初識MySQL數(shù)據(jù)庫——“MySQL數(shù)據(jù)庫”

    各位CSDN的uu們你們好呀,小雅蘭好久沒有更文啦,確實是心有余而力不足,最近學(xué)習(xí)的內(nèi)容太難了,這篇博客又是小雅蘭的新專欄啦,主要介紹的是一些MySQL數(shù)據(jù)庫的知識點,下面,讓我們進(jìn)入初識MySQL數(shù)據(jù)庫的世界吧 為什么要使用數(shù)據(jù)庫 數(shù)據(jù)庫與數(shù)據(jù)庫管理系統(tǒng) MySQL介紹

    2024年02月06日
    瀏覽(18)
  • 【MySQL數(shù)據(jù)庫】MySQL數(shù)據(jù)庫管理

    【MySQL數(shù)據(jù)庫】MySQL數(shù)據(jù)庫管理

    Structure Query Language(結(jié)構(gòu)化查詢語言)簡稱SQL,它被美國國家標(biāo)準(zhǔn)局(ANSI)確定為關(guān)系型數(shù)據(jù)庫語言的美國標(biāo)準(zhǔn),后被國際化標(biāo)準(zhǔn)組織(ISO)采納為關(guān)系數(shù)據(jù)庫語言的國際標(biāo)準(zhǔn)。數(shù)據(jù)庫管理系統(tǒng)可以通過SQL管理數(shù)據(jù)庫;定義和操作數(shù)據(jù),維護(hù)數(shù)據(jù)的完整性和安全性。 數(shù)據(jù):(data)

    2024年02月08日
    瀏覽(49)
  • MySQL數(shù)據(jù)庫:數(shù)據(jù)庫管理系統(tǒng)與安裝MySQL數(shù)據(jù)庫

    MySQL數(shù)據(jù)庫:數(shù)據(jù)庫管理系統(tǒng)與安裝MySQL數(shù)據(jù)庫

    目錄 一、理論 1.數(shù)據(jù)庫管理系統(tǒng) 2.關(guān)系型數(shù)據(jù)庫 3.數(shù)據(jù)庫 4.MySQL數(shù)據(jù)庫 5.MySQL部署 二、實驗 1.yum安裝MySQL 2.編譯安裝MySQL 3.配置MySQL數(shù)據(jù)庫的Tab補(bǔ)全? 三、問題 1.數(shù)據(jù)庫登錄報錯 2.數(shù)據(jù)庫密碼復(fù)雜度報錯 3.數(shù)據(jù)庫連接報錯 四、總結(jié) (1)概念 數(shù)據(jù)庫管理系統(tǒng)(Database Management

    2024年02月12日
    瀏覽(28)
  • 初識mysql數(shù)據(jù)庫之mysql數(shù)據(jù)庫安裝(centos)

    初識mysql數(shù)據(jù)庫之mysql數(shù)據(jù)庫安裝(centos)

    目錄 一、卸載不需要的環(huán)境 二、安裝mysql yum源 三、安裝mysql 四、登錄mysql 1. 直接登錄 2. 設(shè)置免密碼登錄 五、配置my.cnf 六、mysql登錄時的一些選項介紹 要注意,在安裝mysql數(shù)據(jù)庫時,最好將用戶切換為root,避免一些不必要的問題。當(dāng)數(shù)據(jù)庫安裝好后,普通用戶也可以使用的

    2024年02月03日
    瀏覽(25)
  • MySQL筆記——MySQL數(shù)據(jù)庫介紹以及在Linux里面安裝MySQL數(shù)據(jù)庫,對MySQL數(shù)據(jù)庫的簡單操作,MySQL的外接應(yīng)用程序使用說明

    MySQL筆記——MySQL數(shù)據(jù)庫介紹以及在Linux里面安裝MySQL數(shù)據(jù)庫,對MySQL數(shù)據(jù)庫的簡單操作,MySQL的外接應(yīng)用程序使用說明

    MySQL筆記——MySQL數(shù)據(jù)庫介紹以及在Linux里面安裝MySQL數(shù)據(jù)庫,對MySQL數(shù)據(jù)庫的簡單操作,MySQL的外接應(yīng)用程序使用說明 MySQL筆記——表的分組查詢、表的分頁查詢、表的約束、數(shù)據(jù)庫設(shè)計 MySQL案例——多表查詢以及嵌套查詢 MySQL筆記——數(shù)據(jù)庫當(dāng)中的事務(wù)以及Java實現(xiàn)對數(shù)據(jù)庫進(jìn)

    2024年01月16日
    瀏覽(54)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包