精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

B+樹索引如何對Mysql單表數據量造成影響

電子設計 ? 來源:博客園 ? 作者:佚名 ? 2020-04-16 08:08 ? 次閱讀

Mysql 單表適合的最大數據量是多少?

我們說 Mysql 單表適合存儲的最大數據量,自然不是說能夠存儲的最大數據量,如果是說能夠存儲的最大量,那么,如果你使用自增 ID,最大就可以存儲 2^32 或 2^64 條記錄了,這是按自增 ID 的數據類型 int 或 bigint 來計算的;如果你不使用自增 id,且沒有 id 最大值的限制,如使用足夠長度的隨機字符串,那么能夠限制單表最大數據量的就只剩磁盤空間了。顯然我們不是在討論這個問題。

影響 Mysql 單表的最優最大數量的一個重要因素其實是索引

我們知道 Mysql 的主要存儲引擎 InnoDB 采用 B+樹結構索引。(至于為什么 Mysql 選擇 b+樹而不是其他數據結構來組織索引,不是本文討論的話題,之后的文章會講到。)那么 B+樹索引是如何影響 Mysql 單表數據量的呢?

B+樹

一棵 B+樹如下所示:

B+樹索引如何對Mysql單表數據量造成影響

Mysql 的 B+樹索引存儲在磁盤上,Mysql 每次讀取磁盤 Page 的大小是 16KB,為了保證每次查詢的效率,需要保證每次查詢訪問磁盤的次數,一般設計為 2-3 次磁盤訪問,再多性能將嚴重不足。Mysql B+樹索引的每個節點需要存儲一個指針(8Byte)和一個鍵值(8Byte)。因此計算16KB/(8B+8B)=1K 16KB 可以存儲 1K 個節點,3 次磁盤訪問(即 B+樹 3 的深度)可以存儲 1K _ 1K _ 1K 即 10 億數據。

如果查詢依賴非主鍵索引,那么還涉及二級索引。這樣數據量將更小。

拆分

分而治之——沒有什么問題不能通過拆分一次來解決,不行就拆多次。

Mysql 單表存儲的數據量有限。一個解決大數據量存儲的辦法就是分庫分表。說白了就是一個數據庫一張表放不下那么多數據,那就分多個數據庫多張表存儲。

拆分可分為垂直拆分和水平拆分。

垂直拆分是按照不同的表(或者 Schema)來切分到不同的數據庫(主機)之上,水平拆分則是根據表中的數據的邏輯關系,將同一個表中的數據按照某種條件拆分到多臺數據庫(主機)上面或多張相同 Schema 的不同表中。

垂直拆分的最大特點就是規則簡單,實施也更為方便,尤其適合各業務之間的耦合度非常低,相互影響很小,業務邏輯非常清晰的系統。在這種系統中,可以很容易做到將不同業務模塊所使用的表分拆到不同的數據庫中。根據不同的表來進行拆分,對應用程序的影響也更小,拆分規則也會比較簡單清晰。

水平拆分與垂直切分相比,相對來說稍微復雜一些。因為要將同一個表中的不同數據拆分到不同的數據庫中,對于應用程序來說,拆分規則本身就較根據表名來拆分更為復雜,后期的數據維護也會更為復雜一些。

垂直拆分最直接的就是按領域拆分服務,隔離領域數據庫。如此每個庫所承擔的數據壓力就減少了。

水平拆分就是將同一個 Schema 的數據拆分到不同的庫或不同的表中,這樣每個表的數據量也將減小,查詢效率將更高效。水平拆分就涉及到表的分片規則問題。

幾種典型的分片規則包括:

按照用戶 ID 求模,將數據分散到不同的數據庫,具有相同數據用戶的數據都被分散到一個庫中。

按照日期,將不同月甚至日的數據分散到不同的庫中。

按照某個特定的字段求摸,或者根據特定范圍段分散到不同的庫中。

實現

門面模式——沒有什么問題不能通過添加一個中間層來解決。

垂直拆分的一個方案就是在應用層使用多個數據源,按業務訪問不同的數據源。另外更好方案其實就是微服務化。按不同的業務領域來拆分微服務,明確領域邊界,隔離領域數據庫。這樣將對數據的存取內聚到獨立的服務之中,對外提供統一的接口。在需要同時依賴多個服務時,我們可以通過添加門面應用來組合底層服務的數據,以提供更符合上層業務需求的接口,這些服務往往更接近真實的業務。而底層的服務則是更加內聚的資源服務。

代理模式——沒有什么問題不能通過添加一個中間層來解決。

對于水平拆分應該盡量屏蔽拆分帶來的數據訪問困惱,為了讓上層業務無需關心下層數據組織方式。水平拆分往往通過添加一個代理層來做這些事情,代理層對上提供虛擬表,這些虛擬表就像我們在單庫上設計的單表一樣;代理層對下解析和拆分執行 sql,然后按相應規則在不同的庫和表執行相應的 sql 請求,再合并數據,并將合并后的結果返回給上層調用者。

一般代理方式分為如下兩種:

進程內代理

進程內代理即將代理層嵌入到業務服務內部,攔截 sql 請求并做相應的處理。這樣的好處是簡單,但是侵入性大,且不夠靈活。

進程內代理

進程外代理

進程外代理即將代理獨立成服務,代理真實業務服務和數據庫之間的請求。這樣是比較復雜的,需要高可用的代理服務架構。但是這樣對業務的侵入性低,且易于升級擴展。

進程外代理

問題

分布式事務問題

什么是分布式事務?本地事務的定義就是一系列相關的數據庫操作完成后要滿足 ACID 四大特性,而分布式事務就是將同一進程的操作放到不同的微服務進程中,即不同微服務應用進程的數據庫操作滿足事務要求,或者對不同數據庫的一系列操作需滿足事務要求。

這里就有兩個問題需要解決。一個是因為應用的分布式造成的,一個是因為數據庫本身的分布式造成的。數據庫本身的分布式事務問題一般由數據庫自身解決,大多數分布式數據庫都可以做到一定的數據一致性保證,如 HBase 保證的強一致性,Cassandra 保證的最終一致性。

應用數據的一致性事務方案我們也可以參考分布式數據庫的實現原理來實現。業界也有很多分布式事務的解決思路,如:

XA 方案

TCC 方案

本地消息表

可靠消息最終一致性方案

最大努力通知方案

多表 Join 問題

通過分析 Join sql,將 sql 拆分成獨立的查詢請求,然后分別執行,并將結果合并計算返回給調用者。這個地方會涉及到很多執行優化的問題。

數據統計問題

當數據被分片到不同的數據庫或不同的表中時,要對數據做一些全局的或涉及大量數據的統計時便會遇到一些問題。如求 Max,Min,Sum 等聚合問題。如果統計的數據有一定的業務規則,如只會按用戶維度去統計,如統計某個用戶的訂單量,那么對訂單表的分片,其實可以采用按用戶 id 來分片,如此就可以解決這類統計問題。但是這種方案不通用。很多分片代理服務都需要將 sql 分片到不同的節點上去執行,然后再合并結果返回。

ID 問題

使用分庫分表之后,就無法使用 Mysql 的表自增作為 id,因為不同庫和表的自增將出現沖突的 id。解決這個問題就需要引入分布式 id 生成技術。

責任編輯:gt


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 引擎
    +關注

    關注

    1

    文章

    360

    瀏覽量

    22531
  • 大數據
    +關注

    關注

    64

    文章

    8864

    瀏覽量

    137304
收藏 人收藏

    評論

    相關推薦

    MySQL數據索引的底層是怎么實現的

    ' 。就能查出特定列(姓名列)的特定值(張三)的記錄。另外,它是一種數據結構。那么mysql數據結構,采用的是B+。那么,為啥選
    發表于 07-28 15:30

    基于B+的動態數據持有性證明方案

    針對云存儲環境下的數據持有性證明( PDP)方案效率較低、不能很好支持全動態更新的問題,設計了一種基于B+的動態數據持有性證明方案。該方案引入雙線性對技術和
    發表于 11-30 17:14 ?0次下載
    基于<b class='flag-5'>B+</b><b class='flag-5'>樹</b>的動態<b class='flag-5'>數據</b>持有性證明方案

    基于KD和R的多維索引結構

    針對云存儲系統大多基于鍵值對 key,value模型存儲數據,多維查詢需要對整個數據集進行完全掃描,查詢效率較低的問題,提出了一種基于KD和R的多維
    發表于 01-25 15:13 ?0次下載
    基于KD<b class='flag-5'>樹</b>和R<b class='flag-5'>樹</b>的多維<b class='flag-5'>索引</b>結構

    MySQL索引使用原則

    一般來說, MySQL 中的 B-Tree 索引的物理文件大多都是以 Balance Tree 的結構來存儲的,也就是所有實際需要的數據都存放于 Tree 的 Leaf Node(葉子
    的頭像 發表于 02-11 15:17 ?2701次閱讀
    <b class='flag-5'>MySQL</b><b class='flag-5'>索引</b>使用原則

    MySQL索引的使用問題

    一、前言 在MySQL中進行SQL優化的時候,經常會在一些情況下,對MySQL能否利用索引有一些迷惑。譬如:1、MySQL 在遇到范圍查詢條件的時候就停止匹配了,那么到底是哪些范圍條件
    的頭像 發表于 01-06 16:13 ?1585次閱讀

    關于MySQL ORDER BY的詳解

    回答一些常見的問題(下文僅討論InnoDB存儲引擎)。 2 索引掃描排序和文件排序(filesort)簡介 我們知道InnoDB存儲引擎以B+作為索引的底層實現,
    的頭像 發表于 02-08 11:20 ?2451次閱讀
    關于<b class='flag-5'>MySQL</b> ORDER BY的詳解

    掌握這幾種方法 你的接口查詢速度將飛速提升

    1. MySQL查詢慢是什么體驗? 大多數互聯網應用場景都是讀多寫少,業務邏輯更多分布在寫上。對讀的要求大概就是要快。那么都有什么原因會導致我們完成一次出色的慢查詢呢? 1.1 索引數據量不是
    的頭像 發表于 07-06 14:38 ?1791次閱讀

    B+ 索引MySQL 中的認識

    概述 本質:數據庫維護某種數據結構以某種方式引用(指向)數據 索引取舍原則:索引的結構組織要盡量減少查找過程中磁盤I/O的存取次數
    的頭像 發表于 11-08 11:11 ?1252次閱讀
    對 <b class='flag-5'>B+</b> <b class='flag-5'>樹</b>與<b class='flag-5'>索引</b>在 <b class='flag-5'>MySQL</b> 中的認識

    Mysql索引為什么使用B+

    比方說我們想要查找行數據5。會先從頂層頁的record們入手。record里包含了主鍵id和頁號(頁地址)。關注黃色的箭頭,向左最小id是1,向右最小id是7。那id=5的數據如果存在,那必定在左邊
    的頭像 發表于 06-08 16:34 ?682次閱讀
    <b class='flag-5'>Mysql</b><b class='flag-5'>索引</b>為什么使用<b class='flag-5'>B+</b><b class='flag-5'>樹</b>?

    MySQL高級進階:索引優化

    MySQL官方對于索引的定義:索引是幫助MySQL高效獲取數據數據結構。
    的頭像 發表于 06-11 11:13 ?554次閱讀
    <b class='flag-5'>MySQL</b>高級進階:<b class='flag-5'>索引</b>優化

    MySQL為什么選擇B+作為索引結構?

    MySQL中,無論是Innodb還是MyIsam,都使用了B+索引結構(這里不考慮hash等其他索引)。本文將從最普通的二叉查找
    的頭像 發表于 07-20 11:28 ?919次閱讀
    <b class='flag-5'>MySQL</b>為什么選擇<b class='flag-5'>B+</b><b class='flag-5'>樹</b>作為<b class='flag-5'>索引</b>結構?

    MySQL索引的常用知識點

    索引結構:B+ 索引其實是一種數據結構 注意B+
    的頭像 發表于 09-30 16:43 ?440次閱讀

    索引是什么意思 優缺點有哪些

    數據結構,以協助快速查詢、更新數據數據索引的實現通常使用B
    的頭像 發表于 10-09 10:19 ?2804次閱讀

    MySQL數據量限制:為何2000萬行成為瓶頸?

    很多人認為:數據量超過500萬行或2000萬行時,引起B+tree的高度增加,延長了索引的搜索路徑,進而導致了性能下降。事實果真如此嗎?
    的頭像 發表于 02-27 10:38 ?5719次閱讀
    <b class='flag-5'>MySQL</b><b class='flag-5'>單</b><b class='flag-5'>表</b><b class='flag-5'>數據量</b>限制:為何2000萬行成為瓶頸?

    一文了解MySQL索引機制

    的呢?一起靜下心來,耐心看完這篇文章吧,干貨不啰嗦,相信你一定會有所收獲。 一、索引模型 模型也就是數據結構,常見的三種模型分別是哈希、有序數組和搜索。 了解
    的頭像 發表于 07-25 14:05 ?241次閱讀
    一文了解<b class='flag-5'>MySQL</b><b class='flag-5'>索引</b>機制