目錄
唯一主鍵
分錶
C端查詢
其他端查詢
總結
首頁 資料庫 mysql教程 了解百億級資料分錶後的 分頁查詢

了解百億級資料分錶後的 分頁查詢

Nov 09, 2020 pm 05:24 PM
分頁查詢

mysql影片教學欄位介紹百億級資料的分頁查詢。

了解百億級資料分錶後的 分頁查詢

當業務規模達到一定規模之後,像淘寶日訂單量在5000萬單以上,美團3000萬單以上。資料庫面對海量的資料壓力,分庫分錶就是必須進行的操作了。而分庫分錶之後一些常規的查詢可能都會產生問題,最常見的就是例如分頁查詢的問題。一般我們把分錶的欄位稱為shardingkey,例如訂單表依照使用者ID作為shardingkey,那麼如果查詢條件中不帶使用者ID查詢怎麼做分頁?又例如更多的多維度的查詢都沒有shardingkey又怎麼查詢?

唯一主鍵

一般我們資料庫的主鍵都是自增的,那麼分錶之後主鍵衝突的問題就是一個無法避免的問題,最簡單的辦法就是以一個唯一的業務欄位作為唯一的主鍵,例如訂單表的訂單號碼肯定是全域唯一的。

常見的分散式產生唯一ID的方式很多,最常見的雪花演算法Snowflake、滴滴Tinyid、美團Leaf。以雪花演算法舉例來說,一毫秒可以產生4194304多個ID。

第一位不使用,預設都是0,41位元時間戳精確到毫秒,可以容納69年的時間,10位元工作機器ID高5位是資料中心ID,低5位是節點ID,12位元序號每個節點每毫秒累加,累計可以達到2^12 4096個ID。

分錶

第一步,分錶後要怎麼保證訂單號碼的唯一搞定了,現在考慮下分錶的問題。首先根據自身的業務量和增量來考慮分錶的大小。

舉個例子,現在我們日單量是10萬單,預估一年後可以達到日100萬單,根據業務屬性,一般我們就支持查詢半年內的訂單,超過半年的訂單需要做歸檔處理。

那麼以日訂單100萬半年的數量級來看,不分錶的話我們訂單量將達到100萬X180=1.8億,以這個數據量級部分錶的話肯定單表是扛不住的,就算你能扛RT的時間你也根本無法接受吧。根據經驗單表數百萬的數量對於資料庫是沒什麼壓力的,那麼只要分256張表就足夠了,1.8億/256≈70萬,如果為了保險起見,也可以分到512張表。那麼考慮一下,如果業務量再成長10倍達到1000萬單每天,分錶1024就是比較適合的選擇。

透過分錶加上超過半年的資料歸檔之後,單表70萬的資料就足以應付大部分場景了。接下來對訂單號碼hash,然後對256取模的就可以落到具體的哪張表了。

那麼,因為唯一主鍵都是以訂單號碼作為依據,以前你寫的那些根據主鍵ID做查詢的就不能用了,這就涉及到了歷史一些查詢功能的修改。不過這都不是事兒對吧,都改成以訂單號碼來查就行了。這都不是問題,問題在我們的標題說的點上。

C端查詢

說了半天,總算到了正題了,那麼分錶之後查詢和分頁查詢的問題怎麼解決?

首先說帶shardingkey的查詢,比如就透過訂單號查詢,不管你分頁還是怎麼樣都是能直接定位到具體的表來查詢的,顯然查詢是不會有什麼問題的。

如果不是shardingkey的話,上面舉例說的以訂單號碼作為shardingkey的話,像APP、小程式這種一般都是透過使用者ID查詢,那這時候我們透過訂單號碼做的sharding怎麼辦?很多公司訂單表直接用用戶ID做shardingkey,那麼很簡單,直接查就完了。那麼訂單號碼怎麼辦,一個很簡單的方法就是在訂單號碼上帶上用戶ID的屬性。舉個很簡單的例子,原本41位的時間戳你覺得用不完,用戶ID是10位的,訂單號的生成規則帶上用戶ID,落具體表的時候根據訂單號中10位用戶ID hash取模,這樣無論根據訂單號碼或用戶ID查詢效果都是一樣的。

當然,這種方式只是舉例,具體的訂單號碼產生的規則,多少位,包含哪些因素根據自己的業務和實現機制來決定。

#

好,那麼無論你是訂單號碼還是用戶ID作為shardingkey,按照以上的兩種方式都可以解決問題了。那麼還有一個問題就是如果既不是訂單號碼又不是使用者ID查詢呢?最直觀的例子就是來自商家端或後台的查詢,商家端都是以商家或說賣家的ID作為查詢條件來查的,後台的查詢條件可能就更複雜了,像我碰到的有些後台查詢條件能有幾十個,怎麼查? ? ?別急,接下來分開說B端和後台的複雜查詢。

現實中真正的流量大頭都是來自於用戶端C端,所以本質上解決了用戶端的問題,這個問題就解了大半,剩下來自商家賣家端B端、後台支援營運業務的查詢流量並不會很大,這個問題就好解。

其他端查詢

針對B端的非shardingkey的查詢有兩個辦法可以解決。

雙寫,雙寫就是下單的資料落兩份,C端和B端的各自保存一份,C端用你可以用單號、用戶ID做shardingkey都行,B端就用商家賣家的ID當shardingkey就好了。有些同學會說了,你雙寫不影響表現嗎?因為對於B端來說輕微的延遲是可以​​接受的,所以可以採取非同步的方式去落B端訂單。你想想你去淘寶買東西下單了,賣家稍微延遲個一兩秒收到這個訂單的消息有什麼關係嗎?你點個外送商戶晚一兩秒收到這個訂單有太大影響嗎?

這是一個解決方案,另外一個方案就是走離線數倉或ES查詢,訂單資料落庫之後,不管你透過binlog還是MQ訊息的都形式,把資料同步到數倉或ES,他們支援的數量級對於這種查詢條件來說就很簡單了。同樣這種方式肯定是稍微有延遲的,但是這種可控範圍的延遲是可以​​接受的。

而針對管理後台的查詢,例如營運、業務、產品需要看數據,他們天然需要複雜的查詢條件,同樣走ES或數倉都可以做得到。如果不用這個方案,又要不帶shardingkey的分頁查詢,兄弟,這就只能掃全表查詢聚合數據,然後手動做分頁了,但是這樣查出來的結果是有限制的。

例如你256​​個片,查詢的時候循環掃描所有的分片,每個片取20條數據,最後聚合數據手工分頁,那必然是不可能查到全量的數據的。

總結

分庫分錶後的查詢問題,對於有經驗的同學來說其實這個問題都知道,但是我相信其實大部分同學做的業務可能都沒來到這個數量級,分庫分錶可能都停留在概念階段,面試被問到後就手足無措了,因為沒有經驗不知道怎麼辦。

分庫分錶首先是基於現有的業務量和未來的增量做出判斷,比如拼多多這種日單量5000萬的,半年數據得有百億級別了,那都得分到4096張表了對吧,但是實際的操作是一樣的,對於你們的業務分4096那就沒有必要了,根據業務做出合理的選擇。

對於基於shardingkey的查詢我們可以很簡單的解決,對於非shardingkey的查詢可以透過落雙份資料和數倉、ES的方案來解決,當然,如果分錶後資料量很小的話,建好索引,掃表查詢其實也不是什麼問題。

相關免費學習推薦:mysql影片教學

以上是了解百億級資料分錶後的 分頁查詢的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何使用PHP資料庫連線實現分頁查詢 如何使用PHP資料庫連線實現分頁查詢 Sep 08, 2023 pm 02:28 PM

如何使用PHP資料庫連線實現分頁查詢在開發web應用程式中,常常會涉及到對資料庫進行查詢並進行分頁顯示的需求。 PHP作為一種常用的服務端腳本語言,具備強大的資料庫連線功能,可以輕鬆實現分頁查詢。本文將詳細介紹如何使用PHP資料庫連線實作分頁查詢,並附上對應的程式碼範例。準備資料庫在開始之前,我們需要準備一個資料庫,包含要查詢的資料。這裡以MySQL資料庫為例,

PHP和PDO: 如何進行分頁查詢和顯示數據 PHP和PDO: 如何進行分頁查詢和顯示數據 Jul 29, 2023 pm 04:10 PM

PHP和PDO:如何進行分頁查詢和顯示資料在開發網頁應用程式時,分頁查詢和顯示資料是一個非常常見的需求。透過分頁,我們可以一次顯示一定數量的數據,提高頁面載入速度和使用者體驗。在PHP中,使用PHP資料物件(PDO)函式庫可以輕鬆實現分頁查詢和顯示資料的功能。本文將介紹如何在PHP中使用PDO進行分頁查詢和顯示數據,並提供相應的程式碼範例。一、建立資料庫和資料表

如何使用Go語言建立高效能的MySQL資料分頁查詢 如何使用Go語言建立高效能的MySQL資料分頁查詢 Jun 17, 2023 am 09:09 AM

隨著網路的快速發展,資料處理已成為了企業應用開發的重要技能。在許多應用程式中,MySQL資料庫經常是最常用的資料儲存之一。在MySQL中,資料分頁查詢是一項常見的資料檢索操作。本文將介紹如何使用Go語言實現高效能的MySQL資料分頁查詢。一、什麼是資料分頁查詢?資料分頁查詢是一種常用的資料檢索技術,它可以讓使用者在一頁上只瀏覽少量的資料而不必一次性加載

PHP如何使用MongoDB進行分頁查詢 PHP如何使用MongoDB進行分頁查詢 Jul 07, 2023 pm 09:28 PM

PHP如何使用MongoDB進行分頁查詢概述:MongoDB是一個非關係型資料庫,常用於儲存大量的文檔數據,而PHP是一種流行的伺服器端腳本語言。在本文中,將介紹如何使用PHP來連接MongoDB,並且實作分頁查詢的功能。步驟一:安裝MongoDB擴充在PHP中與MongoDB互動需要安裝MongoDB的擴充。可以透過以下命令來安裝MongoDB擴充:p

如何在ThinkPHP6中使用Mysql進行分頁查詢 如何在ThinkPHP6中使用Mysql進行分頁查詢 Jun 20, 2023 pm 02:01 PM

隨著互聯網的快速發展,Web應用程式的開發也越來越複雜。而分頁查詢是Web應用程式中常見的功能之一。 ThinkPHP6是一個web框架,可以幫助開發人員快速開發應用程式。在本文中,我們將討論如何在ThinkPHP6中使用MySQL進行分頁查詢。首先,我們需要在ThinkPHP6中建立資料庫。在MySQL中建立資料庫的語句如下:CREATEDATABASE

PHP和Oracle資料庫的分頁查詢技巧 PHP和Oracle資料庫的分頁查詢技巧 Jul 11, 2023 pm 11:09 PM

PHP和Oracle資料庫的分頁查詢技巧在開發一個動態網頁時,如果需要展示大量數據,就需要進行分頁查詢。分頁查詢是一種將資料劃分為更小的頁面,以便使用者可以輕鬆瀏覽和導航的技術。在本文中,我們將討論如何使用PHP和Oracle資料庫實作分頁查詢,並提供相關的程式碼範例。一、準備工作在開始之前,我們需要確保我們已經安裝並設定好了PHP和Oracle資料庫。如果還

如何使用thinkorm輕鬆實現分頁查詢功能 如何使用thinkorm輕鬆實現分頁查詢功能 Jul 31, 2023 pm 10:41 PM

如何使用thinkorm輕鬆實現分頁查詢功能概述:在開發網站或應用程式時,常常需要對資料庫中的資料進行分頁查詢,以便在頁面上展示部分資料並提供翻頁功能。本文將介紹如何使用thinkorm框架輕鬆實現分頁查詢功能,並提供相關的程式碼範例。步驟一:安裝thinkorm首先,需要在專案中安裝thinkorm框架,可以使用以下指令進行安裝:composerrequi

MySql的分頁查詢:如何處理大資料庫分頁的效能問題 MySql的分頁查詢:如何處理大資料庫分頁的效能問題 Jun 15, 2023 pm 03:28 PM

在現代應用程式中,大部分的數據都需要分頁顯示。當應用程式需要處理大量資料的時候,這會對伺服器和資料庫造成壓力,導致查詢耗時變長。 Mysql是目前最受歡迎的關係型資料庫之一,本文將討論如何最佳化Mysql分頁查詢的效能問題。分頁原理在開始最佳化之前,我們必須先了解分頁原理。分頁查詢的主要原理是將表格資料​​分成若干分頁,然後逐一分頁查詢資料。例如,如果我們需要在一

See all articles