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

百萬數(shù)據(jù)分頁查詢優(yōu)化方案

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

分頁問題

分頁列表查詢是項(xiàng)目中的熱點(diǎn)需求,這種需求的特點(diǎn)是:字段多、數(shù)據(jù)量大、訪問頻繁、使用率高的特點(diǎn),這個(gè)功能是給用戶最直觀的展示系統(tǒng)的信息,針對于多、大、頻、熱這幾個(gè)特點(diǎn),會引申出一個(gè)問題:列表展示的數(shù)據(jù)可能是來自于不同的數(shù)據(jù)維度、需要關(guān)聯(lián)N張表查詢得到,那么,如何讓用戶更快、更準(zhǔn)的獲取到需要的數(shù)據(jù),便成了程序員在編碼時(shí)需要考慮到并且需要解決的問題,因?yàn)殡S時(shí)間推移,線上系統(tǒng)不乏幾百萬數(shù)據(jù)的表。

準(zhǔn)備
CREATE TABLE `test_temp` (
  `test_id` int NOT NULL AUTO_INCREMENT,
  `field_1` varchar(20) DEFAULT NULL,
  `field_2` varchar(20) DEFAULT NULL,
  `field_3` bigint DEFAULT NULL,
  `create_date` date DEFAULT NULL,
  PRIMARY KEY (`test_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1000001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

寫一個(gè)存儲過程生成200萬測試數(shù)據(jù):

drop procedure if exists test_insert;
create procedure test_insert(n int)
begin
    declare v int default 0;
    SET AUTOCOMMIT = 0;
    while v < n
        do
            insert into test_temp(field_1, field_2, field_3, create_date)
            values (concat('testing',v),
                    substring(md5(rand()), 1, 10),
                    floor(rand() * 1000000),
                    adddate('1970-01-01', rand(v) * 10000));
            set v = v + 1;
        end while;
    SET AUTOCOMMIT = 1;
end;

插入數(shù)據(jù):

call test_insert(2000000);

測試數(shù)據(jù)方案來自于:

https://blog.csdn.net/weixin_38924697/article/details/119978916

現(xiàn)象

帶分頁的語句,我們一般使用Limit實(shí)現(xiàn),那么基于以上數(shù)據(jù)我們寫一個(gè)SQL:

SELECT * from test_temp LIMIT 1,10

執(zhí)行時(shí)間:0.004秒

百萬數(shù)據(jù)分頁查詢優(yōu)化方案,筆記,思考,MySQL,java,數(shù)據(jù)庫

百萬數(shù)據(jù)分頁查詢優(yōu)化方案,筆記,思考,MySQL,java,數(shù)據(jù)庫此時(shí),我們模擬分頁數(shù)據(jù)特別往后的情況,分頁數(shù)據(jù)越往后越慢。

SELECT SQL_NO_CACHE * from test_temp LIMIT 19999900,10

執(zhí)行時(shí)間:1.348秒,速度慢了二十余倍。

實(shí)際的業(yè)務(wù)場景下,可能會關(guān)聯(lián)N張表,而且線上服務(wù)器的壓力會比單機(jī)開發(fā)環(huán)境更重,因此實(shí)際接口響應(yīng)時(shí)間會更長。

問題原因
  1. 回表:查詢頻率高的字段會建立索引,但是并不是所有的查詢字段都會在索引上,無法命中索引的字段則需要回表,回表是IO操作,因?yàn)樾枰鶕?jù)索引查找到數(shù)據(jù)行后,再根據(jù)數(shù)據(jù)行的主鍵或唯一索引去聚簇索引中查找具體的數(shù)據(jù)行。因此在執(zhí)行回表操作時(shí)需要從磁盤讀取數(shù)據(jù),而磁盤IO是相對較慢的操作。
  2. 查詢規(guī)則:limit 19999900,10并不是從第19999900行開始掃描,使用explain查看執(zhí)行計(jì)劃:百萬數(shù)據(jù)分頁查詢優(yōu)化方案,筆記,思考,MySQL,java,數(shù)據(jù)庫
解決方案

當(dāng)查詢的字段都被索引覆蓋時(shí),可無需回表,那么我們可以先查詢出主鍵id,再根據(jù)主鍵id拼接id條件或者作為臨時(shí)表JOIN原表就可以了。因?yàn)橹麈Iid是最快的索引:聚簇索引,通過id就能快速找到指定行。

查詢方案一:

先查詢出id,再根據(jù)id直接查詢數(shù)據(jù)。

查詢出id
SELECT test_id from test_temp LIMIT 1999995,5

百萬數(shù)據(jù)分頁查詢優(yōu)化方案,筆記,思考,MySQL,java,數(shù)據(jù)庫

執(zhí)行計(jì)劃:

百萬數(shù)據(jù)分頁查詢優(yōu)化方案,筆記,思考,MySQL,java,數(shù)據(jù)庫

再根據(jù)這些id為條件查詢數(shù)據(jù)
SELECT * from test_temp WHERE test_id in (2952993,2952995,2952996,2952997)

百萬數(shù)據(jù)分頁查詢優(yōu)化方案,筆記,思考,MySQL,java,數(shù)據(jù)庫

優(yōu)化后的查詢時(shí)間為:0.002秒。

執(zhí)行計(jì)劃

百萬數(shù)據(jù)分頁查詢優(yōu)化方案,筆記,思考,MySQL,java,數(shù)據(jù)庫

查詢方案二:

使用子查詢作為臨時(shí)表Inner join主表查詢:

SELECT * from (SELECT test_id from test_temp LIMIT 1999995,5) as temp INNER JOIN test_temp tt on tt.test_id = temp.test_id

百萬數(shù)據(jù)分頁查詢優(yōu)化方案,筆記,思考,MySQL,java,數(shù)據(jù)庫

整體查詢時(shí)間:0.245秒

執(zhí)行計(jì)劃:

百萬數(shù)據(jù)分頁查詢優(yōu)化方案,筆記,思考,MySQL,java,數(shù)據(jù)庫

性能對比

在不考慮MySQL執(zhí)行時(shí)校驗(yàn)權(quán)限、建立連接的情況下,兩種方案整體查詢時(shí)間在0.25秒左右,相比于整體查詢的1.34秒具有較大優(yōu)勢。方案一相較于方案二的SQL語句更加簡潔易懂,而方案二只需與MySL建立一次查詢即可。

其他優(yōu)化項(xiàng)

請參考:

百萬查詢注意點(diǎn)文章來源地址http://www.zghlxwxcb.cn/news/detail-605879.html

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

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

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

相關(guān)文章

  • MySQL分頁查詢詳解:優(yōu)化大數(shù)據(jù)集的LIMIT和OFFSET

    MySQL分頁查詢詳解:優(yōu)化大數(shù)據(jù)集的LIMIT和OFFSET

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

    2024年02月10日
    瀏覽(17)
  • 【性能優(yōu)化】MySql數(shù)據(jù)庫查詢優(yōu)化方案

    【性能優(yōu)化】MySql數(shù)據(jù)庫查詢優(yōu)化方案

    了解系統(tǒng)運(yùn)行效率提升的整體解決思路和方向 學(xué)會MySQl中進(jìn)行數(shù)據(jù)庫查詢優(yōu)化的步驟 學(xué)會看慢查詢、執(zhí)行計(jì)劃、進(jìn)行性能分析、調(diào)優(yōu) ?關(guān)于這個(gè)問題,我們通常首先考慮的是硬件升級,畢竟服務(wù)器的內(nèi)存、CPU、磁盤IO速度 、網(wǎng)絡(luò)速度等都是制約我們系統(tǒng)快慢的首要因素。硬

    2024年02月03日
    瀏覽(27)
  • Mysql如何優(yōu)化數(shù)據(jù)查詢方案

    Mysql如何優(yōu)化數(shù)據(jù)查詢方案

    mysql做讀寫分離 讀寫分離是提高mysql并發(fā)的首選方案。 Mysql主從復(fù)制的原理 mysql的主從復(fù)制依賴于binlog,也就是記錄mysql上的所有變化并以二進(jìn)制的形式保存在磁盤上,復(fù)制的過程就是將binlog中的數(shù)據(jù)從主庫傳輸?shù)綇膸焐稀?主從復(fù)制過程詳細(xì)分為3個(gè)階段: 第一階段:主庫寫

    2024年02月21日
    瀏覽(19)
  • java使用jdbcTemplate查詢并插入百萬級數(shù)據(jù)解決方案

    java使用jdbcTemplate查詢并插入百萬級數(shù)據(jù)解決方案

    背景:使用JdbcTemplate查詢500萬數(shù)據(jù),然后插入到數(shù)據(jù)庫。 這么多的數(shù)據(jù)按照普通的方式直接查詢?nèi)缓蟛迦耄?wù)器肯定會掛掉,我嘗試過使用分頁查詢的方式去進(jìn)行分批查詢插入,雖然也能達(dá)到保證服務(wù)器不掛掉的效果,但是有一個(gè)嚴(yán)重的問題,每次查詢的數(shù)據(jù)很難保證順序

    2024年02月03日
    瀏覽(24)
  • oracle 大數(shù)據(jù)常見優(yōu)化 &分頁查詢

    oracle 大數(shù)據(jù)常見優(yōu)化 &分頁查詢

    參考某微信社區(qū)博主,此文為溫故知新;原參考博主賬號與鏈接已丟失 1.limit 語句樣式:select * from table limit m,n 適用場景:適用于數(shù)據(jù)量較少的情況(元組、百/千) 缺點(diǎn):全表掃描,速度劣勢,有的數(shù)據(jù)庫結(jié)果集返回不穩(wěn)定。limit限制是從結(jié)果集的M位置處取出N條輸出,其余

    2024年02月05日
    瀏覽(32)
  • 千萬級數(shù)據(jù)深分頁查詢SQL性能優(yōu)化實(shí)踐

    如何在Mysql中實(shí)現(xiàn)上億數(shù)據(jù)的遍歷查詢?先來介紹一下系統(tǒng)主角:關(guān)注系統(tǒng),主要是維護(hù)京東用戶和業(yè)務(wù)對象之前的關(guān)注關(guān)系;并對外提供各種關(guān)系查詢,比如查詢用戶的關(guān)注商品或店鋪列表,查詢用戶是否關(guān)注了某個(gè)商品或店鋪等。但是最近接到了一個(gè)新需求,要求提供查

    2024年02月11日
    瀏覽(30)
  • 重構(gòu)優(yōu)化第三方查詢接口返回大數(shù)據(jù)量的分頁問題

    重構(gòu)優(yōu)化第三方查詢接口返回大數(shù)據(jù)量的分頁問題

    # 問題描述 ? ? ?用戶線上查詢其上網(wǎng)流量詳單數(shù)據(jù)加載慢,且有時(shí)候數(shù)據(jù)沒有響應(yīng)全~ ? ? ?1、經(jīng)排除是調(diào)用第三方數(shù)據(jù)量達(dá)10w條響應(yīng)會超時(shí),數(shù)據(jù)沒正常返回 ? ? ?2、現(xiàn)有線上緩存分頁也是加載慢數(shù)據(jù)不能正常展示 ? ? ?3、第三方接口返回類似報(bào)文jsonj: ? ? ? ? ? 4、我

    2024年02月09日
    瀏覽(31)
  • MySQL查詢優(yōu)化方案匯總(索引相關(guān))

    類型隱式轉(zhuǎn)換 大坑 大數(shù)據(jù)深度分頁,用主鍵 避免使用MySQL函數(shù) 避免類型的隱式轉(zhuǎn)換 避免使用函數(shù)或表達(dá)式,盡量只讓數(shù)據(jù)庫做純粹的增刪改查。 避免使用不等值做排除法 避免使用null值 減少大字段查詢,避免使用*,不說磁盤io的損耗,連網(wǎng)絡(luò)帶寬都跟著損耗。 如果只sel

    2024年03月09日
    瀏覽(21)
  • mysql 模糊查詢like優(yōu)化方案(親測)

    本文的測試是基于 740w條 測試數(shù)據(jù)進(jìn)行的,只討論like模糊查詢的優(yōu)化方案。其他SQL優(yōu)化可參考: SQL優(yōu)化的幾種方式 查詢開頭是“今天不開心”的聊天記錄,是可以走索引的。 查詢包含“今天不開心”的聊天記錄,是不能走索引的。 咱們主要優(yōu)化的是第二種情況,我本人測

    2023年04月08日
    瀏覽(23)
  • mysql mybatis分頁查詢 大數(shù)據(jù)量 非常慢

    mysql mybatis分頁查詢 大數(shù)據(jù)量 非常慢

    ?查閱了很多博客和資料,這篇文章以思路為準(zhǔn),詳細(xì)代碼不細(xì)說,都是非常簡單的方法,一看就明白。具體實(shí)現(xiàn)稍微百度一下就能出來。僅供參考。 如題:單表數(shù)據(jù)已經(jīng)達(dá)到4千萬條數(shù)據(jù),通過mybatis的分頁查詢效率非常低下。 ??????? 當(dāng)然,前提是索引什么的優(yōu)化已經(jīng)都

    2024年01月19日
    瀏覽(21)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包