
大數(shù)據(jù)翻頁(yè)的難點(diǎn)和技巧_數(shù)據(jù)分析師
大數(shù)據(jù),如何優(yōu)化方案做到性能與成本的平衡。我們經(jīng)常會(huì)遇到一種Key-list類型數(shù)據(jù), 如一個(gè)用戶的好友關(guān)系 {“uid”:{1,2,3,4,5}},表示uid包含有5個(gè)好友;一條微博下面的評(píng)論id列表{“weibo_id”: {comment_id1, comment_id2……}},一個(gè)用戶發(fā)表的微博id列表等。
在list長(zhǎng)度較少時(shí)候,我們可以直接的使用數(shù)據(jù)庫(kù)的翻頁(yè)功能,如
1
|
SELECT * FROM LIST_TABLE LIMIT offset, row_count;
|
根據(jù)經(jīng)驗(yàn),在大部分場(chǎng)景下,單個(gè)業(yè)務(wù)的list數(shù)據(jù)長(zhǎng)度99%在1000條以下,在數(shù)據(jù)規(guī)模較小時(shí)候,上面的方法非常適合。但剩下的1%的數(shù)據(jù)可能多達(dá)100萬(wàn)條,在數(shù)據(jù)規(guī)模較大的時(shí)候,當(dāng)訪問(wèn)offset較大的數(shù)據(jù),上述方法非常低效,但在實(shí)現(xiàn)方案的時(shí)候不能忽視這些超大數(shù)據(jù)集的問(wèn)題,因此要實(shí)現(xiàn)一個(gè)適合各種變長(zhǎng)list的翻頁(yè)方案,考慮到數(shù)據(jù)的長(zhǎng)尾問(wèn)題,并沒(méi)有簡(jiǎn)單高效的方案。這也體現(xiàn)了常說(shuō)的80%+的時(shí)間在優(yōu)化20%-的功能。
List數(shù)據(jù)訪問(wèn)模型常見的有兩種方式
扶梯方式在導(dǎo)航上通常只提供上一頁(yè)/下一頁(yè)這兩種模式,部分產(chǎn)品甚至不提供上一頁(yè)功能,只提供一種“更多/more”的方式,也有下拉自動(dòng)加載更多的方式,在技術(shù)上都可以歸納成扶梯方式。
(圖:blogspot的導(dǎo)航條)
(圖:很多瀑布流式的產(chǎn)品只提供一個(gè)more的導(dǎo)航條)
扶梯方式在技術(shù)實(shí)現(xiàn)上比較簡(jiǎn)單及高效,根據(jù)當(dāng)前頁(yè)最后一條的偏移往后獲取一頁(yè)即可,在MySQL可使用以下方法實(shí)現(xiàn)。
1
|
SELECT * FROM LIST_TABLE WHERE id > offset_id LIMIT n;
|
|
|
由于where條件中指定了位置,因此算法復(fù)雜度是O(log n)
另外一種數(shù)據(jù)獲取方式在產(chǎn)品上體現(xiàn)成精確的翻頁(yè)方式,如1,2,3……n,同時(shí)在導(dǎo)航上也可以由用戶輸入直達(dá)n頁(yè)。國(guó)內(nèi)大部分產(chǎn)品經(jīng)理對(duì)電梯方式有特殊的喜好,如圖
但電梯方式在技術(shù)實(shí)現(xiàn)上相對(duì)成本較高,當(dāng)使用以下SQL時(shí)
1
|
SELECT * FROM LIST_TABLE LIMIT offset, row_count;
|
|
|
我們可以使用MySQL explain來(lái)分析,從下文可以看到,當(dāng)offset=10000時(shí)候,實(shí)際上MySQL也掃描了10000行記錄。
為什么會(huì)這樣?在MySQL中,索引通常是b-tree方式(但存儲(chǔ)引擎如InnoDB實(shí)際是b+tree),如圖
從圖中可以看到,使用電梯方式時(shí)候,當(dāng)用戶指定翻到第n頁(yè)時(shí)候,并沒(méi)有直接方法尋址到該位置,而是需要從第一樓逐個(gè)count,scan到 count*page時(shí)候,獲取數(shù)據(jù)才真正開始,所以導(dǎo)致效率不高。對(duì)應(yīng)的算法復(fù)雜度是O(n),n指offset,也就是page*count。
另外Offset并不能有效的緩存,這是由于
1、在數(shù)據(jù)存在新增及刪除的情況下,只要有一條變化,原先的樓層可能會(huì)全部發(fā)生變化。在一個(gè)用戶并發(fā)訪問(wèn)的場(chǎng)景,頻繁變化的場(chǎng)景比較常見。
2、電梯使用比較離散,可能一個(gè)20萬(wàn)條的list,用戶使用了一次電梯直達(dá)100樓之后就走了,這樣即使緩存100樓之下全部數(shù)據(jù)也不能得到有效利用。
以上描述的場(chǎng)景屬于單機(jī)版本,在數(shù)據(jù)規(guī)模較大時(shí)候,互聯(lián)網(wǎng)系統(tǒng)通常使用分庫(kù)的方式來(lái)保存,實(shí)現(xiàn)方法更為復(fù)雜。
在面向用戶的產(chǎn)品中,數(shù)據(jù)分片通常會(huì)將同一用戶的數(shù)據(jù)存在相同的分區(qū),以便更有效率的獲取當(dāng)前用戶的數(shù)據(jù)。如下圖所示
(圖:數(shù)據(jù)按用戶uid進(jìn)行hash拆分)
圖中的不同年份的數(shù)據(jù)的格子是邏輯概念,實(shí)際上同一用戶的數(shù)據(jù)是保存在一張表中。因此方案在常見的使用場(chǎng)景中存在很大不足,大部分產(chǎn)品用戶只訪問(wèn)最 近產(chǎn)生的數(shù)據(jù),歷史的數(shù)據(jù)只有極小的概率被訪問(wèn)到,因此同一個(gè)區(qū)域內(nèi)部的數(shù)據(jù)訪問(wèn)是非常不均勻,如圖中2014年生成的屬于熱數(shù)據(jù),2012年以前的屬于 冷數(shù)據(jù),只有極低的概率被訪問(wèn)到。但為了承擔(dān)紅色部分的訪問(wèn),數(shù)據(jù)庫(kù)通常需要高速昂貴的設(shè)備如SSD,因此上面方案所有的數(shù)據(jù)都需要存在SSD設(shè)備中,即 使這些數(shù)據(jù)已經(jīng)不被訪問(wèn)。
簡(jiǎn)單的解決方案是按時(shí)間遠(yuǎn)近將數(shù)據(jù)進(jìn)行進(jìn)一步分區(qū),如圖。
注意在上圖中使用時(shí)間方式sharding之后,在一個(gè)時(shí)間分區(qū)內(nèi),也需要用前一種方案將數(shù)據(jù)進(jìn)行sharding,因?yàn)橐粋€(gè)時(shí)間片區(qū)通常也無(wú)法用一臺(tái)服務(wù)器容納。
上面的方案較好的解決了具體場(chǎng)景對(duì)于key list訪問(wèn)性能及成本的平衡,但是它存在以下不足
數(shù)據(jù)按時(shí)間進(jìn)行滾動(dòng)無(wú)法全自動(dòng),需要較多人為介入或干預(yù)
數(shù)據(jù)時(shí)間維度需要根據(jù)訪問(wèn)數(shù)據(jù)及模型進(jìn)行精巧的設(shè)計(jì),如果希望實(shí)現(xiàn)一個(gè)公用的key-list服務(wù)來(lái)存儲(chǔ)所有業(yè)務(wù)的數(shù)據(jù),這個(gè)公用服務(wù)可能很難實(shí)現(xiàn)
為了實(shí)現(xiàn)電梯直達(dá)功能,需要增加額外的二級(jí)索引,比如2013年某用戶總共有多少條記錄
由于以上問(wèn)題,尤其是二級(jí)索引的引入,顯然它不是理想中的key list實(shí)現(xiàn),后文繼續(xù)介紹適合大數(shù)據(jù)翻頁(yè)key list設(shè)計(jì)的一些思路及嘗試。文章來(lái)源:CDA數(shù)據(jù)分析師認(rèn)證官網(wǎng)
數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
訓(xùn)練與驗(yàn)證損失驟升:機(jī)器學(xué)習(xí)訓(xùn)練中的異常診斷與解決方案 在機(jī)器學(xué)習(xí)模型訓(xùn)練過(guò)程中,“損失曲線” 是反映模型學(xué)習(xí)狀態(tài)的核心指 ...
2025-09-19解析 DataHub 與 Kafka:數(shù)據(jù)生態(tài)中兩類核心工具的差異與協(xié)同 在數(shù)字化轉(zhuǎn)型加速的今天,企業(yè)對(duì)數(shù)據(jù)的需求已從 “存儲(chǔ)” 轉(zhuǎn)向 “ ...
2025-09-19CDA 數(shù)據(jù)分析師:讓統(tǒng)計(jì)基本概念成為業(yè)務(wù)決策的底層邏輯 統(tǒng)計(jì)基本概念是商業(yè)數(shù)據(jù)分析的 “基礎(chǔ)語(yǔ)言”—— 從描述數(shù)據(jù)分布的 “均 ...
2025-09-19CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫(kù)表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-19SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎(chǔ)用法到實(shí)戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無(wú)論 ...
2025-09-18MySQL 大表拆分與關(guān)聯(lián)查詢效率:打破 “拆分必慢” 的認(rèn)知誤區(qū) 在 MySQL 數(shù)據(jù)庫(kù)管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動(dòng)態(tài)隨機(jī)一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價(jià)值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫(kù)表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實(shí)戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫(kù))處理 Excel 數(shù)據(jù)時(shí),“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗(yàn)與 t 檢驗(yàn):差異、適用場(chǎng)景與實(shí)踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計(jì)學(xué)領(lǐng)域,假設(shè)檢驗(yàn)是驗(yàn)證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計(jì)劃中 rows 數(shù)量的準(zhǔn)確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計(jì)劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對(duì)象的 text 與 content:區(qū)別、場(chǎng)景與實(shí)踐指南 在 Python 進(jìn)行 HTTP 網(wǎng)絡(luò)請(qǐng)求開發(fā)時(shí)(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價(jià)值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫(kù)表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請(qǐng)求工具對(duì)比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請(qǐng)求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)的科學(xué)計(jì)數(shù)法問(wèn)題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)時(shí)的科學(xué)計(jì)數(shù)法問(wèn)題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價(jià)值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運(yùn)營(yíng)問(wèn)題、提升執(zhí)行效率的核心手段,其價(jià)值 ...
2025-09-12用 SQL 驗(yàn)證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實(shí)戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過(guò)程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計(jì)” 與 “用戶體驗(yàn) ...
2025-09-11塔吉特百貨孕婦營(yíng)銷案例:數(shù)據(jù)驅(qū)動(dòng)下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當(dāng)下,精準(zhǔn)營(yíng)銷成為企業(yè)突圍的核心方 ...
2025-09-11