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

MySQL深度分頁(yè)優(yōu)化問題

這篇具有很好參考價(jià)值的文章主要介紹了MySQL深度分頁(yè)優(yōu)化問題。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

☆* o(≧▽≦)o *☆嗨~我是小奧??
??????個(gè)人博客:小奧的博客
??????CSDN:個(gè)人CSDN
??????Github:傳送門
??????面經(jīng)分享(??椭黜?yè)):傳送門
??文章作者技術(shù)和水平有限,如果文中出現(xiàn)錯(cuò)誤,希望大家多多指正!
?? 如果覺得內(nèi)容還不錯(cuò),歡迎點(diǎn)贊收藏關(guān)注喲! ??

MySQL深度分頁(yè)優(yōu)化問題

一、Limit使用

limit子句可以用于強(qiáng)制select語(yǔ)句返回指定的記錄數(shù)。

select 字段 from 表名 limit 參數(shù)1,參數(shù)2;
select 字段 from 表名 limit 參數(shù)2 offset 參數(shù)1;(為了與 PostgreSQL 兼容)
  • 參數(shù)1:指定第一個(gè)返回記錄行的偏移量,從0開始
  • 參數(shù)2:指定返回記錄行的最大數(shù)目

如果只給定一個(gè)參數(shù),那么表示返回的最大記錄行數(shù)目。

如果第二個(gè)參數(shù)為-1,表示第一個(gè)參數(shù)的偏移量之后的所有的數(shù)據(jù)

二、深度分頁(yè)優(yōu)化

查詢偏移量過大的場(chǎng)景我們稱為深度分頁(yè),這會(huì)導(dǎo)致查詢性能較低。比如下面的查詢:

# 普通分頁(yè)查詢
test> select * from t_demo order by id limit 1000000, 10
[2024-01-18 20:26:41]396 ms (execution: 346 ms, fetching: 50 ms) 內(nèi)檢索到從 1 開始的 10

這條SQL在執(zhí)行的過程中,通過非聚簇索引去查詢主鍵,然后拿到主鍵再通過聚簇索引進(jìn)行回表查詢,查詢到滿足條件的1000010條數(shù)據(jù),丟棄前面的1000000條,返回最后10條。

優(yōu)化的思路也非常明確:

  • 減少回表的次數(shù)
  • 盡量通過索引來查詢

2.1 范圍查詢

當(dāng)可以保證 ID 的連續(xù)性時(shí),根據(jù) ID 范圍進(jìn)行分頁(yè)是比較好的解決方案:

# 連續(xù)id時(shí),根據(jù)id范圍進(jìn)行分頁(yè)
test> select * from t_demo where id > 1000000 and id <= 1000010 order by id
[2024-01-18 20:26:41]69 ms (execution: 8 ms, fetching: 61 ms) 內(nèi)檢索到從 1 開始的 10
# 通過記錄上次查詢結(jié)果的最后一條記錄的ID進(jìn)行下一頁(yè)的查詢
test> select * from t_demo where id > 1000000 limit 10
[2024-01-18 20:26:41]76 ms (execution: 6 ms, fetching: 70 ms) 內(nèi)檢索到從 1 開始的 10

但是一般來說,實(shí)際生產(chǎn)中很少會(huì)去使用數(shù)據(jù)庫(kù)的自增ID,所以這種優(yōu)化方式的局限性比較大,而且也不是很有必要。

2.2 子查詢

阿里《Java開發(fā)手冊(cè)》中也有明確的優(yōu)化方式:

MySQL深度分頁(yè)優(yōu)化問題,MySQL,mysql

我們先來看子查詢,子查詢的思路是:先查詢出 limit 第一個(gè)參數(shù)對(duì)應(yīng)的主鍵值,再根據(jù)這個(gè)主鍵值再去過濾并 limit,這樣效率會(huì)高一點(diǎn)。

# 子查詢
test> select * from t_demo where id >= (select id from t_demo limit 1000000, 1) limit 10
[2024-01-18 20:26:41]210 ms (execution: 177 ms, fetching: 33 ms) 內(nèi)檢索到從 1 開始的 10

不過,子查詢的結(jié)果會(huì)先產(chǎn)生一張新的表,會(huì)影響數(shù)據(jù)庫(kù)的性能,所以應(yīng)該避免使用子查詢,并且id>=(...) 也限制了ID必須是遞增的,這同樣不適用比較復(fù)雜的場(chǎng)景。

2.3 inner join 延遲關(guān)聯(lián)

延遲關(guān)聯(lián)的優(yōu)化思路,跟子查詢的優(yōu)化思路其實(shí)是一樣的:都是把條件轉(zhuǎn)移到主鍵索引,然后減少回表。不同點(diǎn)是,延遲關(guān)聯(lián)使用了 INNER JOIN 代替子查詢。

# inner join 延遲關(guān)聯(lián)
test> select t1.* from t_demo t1
      inner join (select id from t_demo limit 1000000, 1) t2
      on t1.id >= t2.id
      limit 10
[2024-01-18 20:26:42]211 ms (execution: 181 ms, fetching: 30 ms) 內(nèi)檢索到從 1 開始的 10

2.4 覆蓋索引

索引中已經(jīng)包含了所有需要獲取的字段的查詢方式稱為覆蓋索引。

# 覆蓋索引
test> select id, a, b from t_demo
      order by a
      limit 1000000, 10
[2024-01-18 20:26:42]279 ms (execution: 248 ms, fetching: 31 ms) 內(nèi)檢索到從 1 開始的 10

覆蓋索引的好處:文章來源地址http://www.zghlxwxcb.cn/news/detail-803829.html

  • 避免 InnoDB 表進(jìn)行索引的二次查詢,也就是回表操作: InnoDB 是以聚集索引的順序來存儲(chǔ)的,對(duì)于 InnoDB 來說,二級(jí)索引在葉子節(jié)點(diǎn)中所保存的是行的主鍵信息,如果是用二級(jí)索引查詢數(shù)據(jù)的話,在查找到相應(yīng)的鍵值后,還要通過主鍵進(jìn)行二次查詢才能獲取我們真實(shí)所需要的數(shù)據(jù)。而在覆蓋索引中,二級(jí)索引的鍵值中可以獲取所有的數(shù)據(jù),避免了對(duì)主鍵的二次查詢 ,減少了 IO 操作,提升了查詢效率。
  • 可以把隨機(jī) IO 變成順序 IO 加快查詢效率: 由于覆蓋索引是按鍵值的順序存儲(chǔ)的,對(duì)于 IO 密集型的范圍查找來說,對(duì)比隨機(jī)從磁盤讀取每一行的數(shù)據(jù) IO 要少的多,因此利用覆蓋索引在訪問時(shí)也可以把磁盤的隨機(jī)讀取的 IO 轉(zhuǎn)變成索引查找的順序 IO。

到了這里,關(guān)于MySQL深度分頁(yè)優(yōu)化問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • MySQL__深度分頁(yè)問題

    ?? @ 作者:Lion J ?? @ 主頁(yè): https://blog.csdn.net/weixin_69252724 ?? @ 主題: MySQL__深度分頁(yè)問題) ?? @ 創(chuàng)作時(shí)間:2024年04月27日 ———————————————— 在我一次測(cè)試中, 100萬(wàn)條數(shù)據(jù), 一次偶然的數(shù)據(jù)展示中, 發(fā)現(xiàn)響應(yīng)數(shù)據(jù)特別慢, 從前端到后端的一個(gè)問題檢查上, 最

    2024年04月28日
    瀏覽(11)
  • MySQL 深度分頁(yè)

    MySQL 深度分頁(yè)是指在分頁(yè)查詢數(shù)據(jù)量比較大的表時(shí),需要訪問表中的某一段數(shù)據(jù),而這段數(shù)據(jù)的位置非常靠后,需要通過較大的 offset 來獲取目標(biāo)數(shù)據(jù)。 默認(rèn)分頁(yè)即通過 limit #{offset}, #{pageSize} 或 limit #{pageSize} offset #{offset} 來進(jìn)行分頁(yè)。二者本質(zhì)上都是全表掃描,MySQL 會(huì)依次取

    2024年01月20日
    瀏覽(12)
  • Mysql——》優(yōu)化limit分頁(yè)

    推薦鏈接: ????總結(jié)——》【Java】 ????總結(jié)——》【Mysql】 ????總結(jié)——》【Redis】 ????總結(jié)——》【Kafka】 ????總結(jié)——》【Spring】 ????總結(jié)——》【SpringBoot】 ????總結(jié)——》【MyBatis、MyBatis-Plus】 ????總結(jié)——》【Linux】 ????總結(jié)——》【MongoDB】 ???

    2024年02月13日
    瀏覽(18)
  • 73.MySQL 分頁(yè)原理與優(yōu)化(上)

    73.MySQL 分頁(yè)原理與優(yōu)化(上)

    我們刷網(wǎng)站的時(shí)候,我們經(jīng)常會(huì)遇到需要分頁(yè)查詢的場(chǎng)景。比如下圖紅框里的翻頁(yè)功能。 我們很容易能聯(lián)想到可以用 mysql 實(shí)現(xiàn)。假設(shè)我們的建表 sql 是這樣的 建表 sql 大家也不用扣細(xì)節(jié),只需要知道 id 是主鍵,并且在 user_name 建了個(gè)非主鍵索引就夠了,其他都不重要。 為了

    2024年01月23日
    瀏覽(16)
  • MySQL大數(shù)據(jù)量分頁(yè)查詢方法及其優(yōu)化

    ---方法1: 直接使用數(shù)據(jù)庫(kù)提供的SQL語(yǔ)句 ---語(yǔ)句樣式: MySQL中,可用如下方法: SELECT * FROM 表名稱 LIMIT M,N ---適應(yīng)場(chǎng)景: 適用于數(shù)據(jù)量較少的情況(元組百/千級(jí)) ---原因/缺點(diǎn): 全表掃描,速度會(huì)很慢 且 有的數(shù)據(jù)庫(kù) 結(jié)果集返回不穩(wěn)定 (如某次返回1,2,3,另外的一次返回2,1,3). Limit限制的是從

    2024年02月15日
    瀏覽(20)
  • MySQL分頁(yè)查詢?cè)斀猓簝?yōu)化大數(shù)據(jù)集的LIMIT和OFFSET

    MySQL分頁(yè)查詢?cè)斀猓簝?yōu)化大數(shù)據(jù)集的LIMIT和OFFSET

    最近在工作中,我們遇到了一個(gè)需求,甲方要求直接從數(shù)據(jù)庫(kù)導(dǎo)出一個(gè)業(yè)務(wù)模塊中所有使用中的工單信息。為了實(shí)現(xiàn)這一目標(biāo),我編寫了一條SQL查詢語(yǔ)句,并請(qǐng)求DBA協(xié)助導(dǎo)出數(shù)據(jù)。盡管工單數(shù)量并不多,只有3000多條,但每個(gè)工單都包含了大量的信息。DBA進(jìn)行了多次導(dǎo)出操作,

    2024年02月10日
    瀏覽(16)
  • MySQL性能深度優(yōu)化

    MySQL性能深度優(yōu)化

    這里的深度優(yōu)化是指,除了建索引、左匹配索引等等其他的優(yōu)化手段。 文章涉及到操作系統(tǒng)連接數(shù)、IO、Mysql本身的某些參數(shù)設(shè)置,值得記錄下來。 CPU:48C 內(nèi)存:128G DISK:3.2TSSD innodb_thread_concurrency=32 表示SQL經(jīng)過解析后,允許同時(shí)有32個(gè)線程去innodb引擎取數(shù)據(jù),如果超過32個(gè),

    2024年02月09日
    瀏覽(39)
  • Mysql Php 推送獲取隨機(jī)數(shù)據(jù)解決分頁(yè)重復(fù)問題

    或許你已經(jīng)看過很多博主寫的文章,要不就是抄襲,要不就是給你一個(gè)下面的語(yǔ)句,隨機(jī)是隨機(jī)了,但是多來兩頁(yè),你會(huì)發(fā)現(xiàn)前面出現(xiàn)的數(shù)據(jù)在第三頁(yè)甚至第二頁(yè)就出現(xiàn)了 這是因?yàn)閞and()機(jī)制的問題,他每次都會(huì)打亂數(shù)據(jù)給你,然后你去取的時(shí)候0-10,11-20都有可能是同一個(gè)數(shù)據(jù)

    2024年02月06日
    瀏覽(16)
  • mybatis-plus技巧--動(dòng)態(tài)表名-多語(yǔ)句-拼接sql--關(guān)于mybatis的mysql分頁(yè)查詢總數(shù)的優(yōu)化思考

    mybatis-plus技巧--動(dòng)態(tài)表名-多語(yǔ)句-拼接sql--關(guān)于mybatis的mysql分頁(yè)查詢總數(shù)的優(yōu)化思考

    傳入tableName參數(shù)就可以了,不過只能用$不能用# 因?yàn)?會(huì)發(fā)生預(yù)編譯,然后會(huì)在表名上加引號(hào)’\\\'。 新建一個(gè)表名攔截類實(shí)現(xiàn)TableNameHandler mybatisPlus添加插件 實(shí)例: 每天按統(tǒng)計(jì) 如果表名為count則加上今天的時(shí)間 每次設(shè)置 直接設(shè)置名字,然后就會(huì)改變的。 需要在配置文件中的

    2024年01月16日
    瀏覽(23)
  • 若依分離版——解決配置雙數(shù)據(jù)源oracle,mysql分頁(yè)錯(cuò)誤問題

    若依分離版——解決配置雙數(shù)據(jù)源oracle,mysql分頁(yè)錯(cuò)誤問題

    1. 按照若依的手冊(cè)配置雙數(shù)據(jù)源mysql,oracle ? 2. 在service指定 數(shù)據(jù)源?@DataSource(value = DataSourceType.MASTER) 或者@DataSource(value = DataSourceType.SLAVE) 3. 發(fā)現(xiàn)出現(xiàn)使用分頁(yè)的情況下報(bào)錯(cuò),不使用分頁(yè)時(shí)正常。 4.? 最后找到解決辦法,是application.yml文件的pagehelper分頁(yè)配置有誤,正確配置如

    2024年02月15日
    瀏覽(33)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包