主頁 > 資料庫 > 為什么MySQL單表不能超過2000萬行?

為什么MySQL單表不能超過2000萬行?

2023-05-23 09:43:51 資料庫

摘要:MySQL一張表最多能存多少資料?

本文分享自華為云社區《為什么MySQL單表不能超過2000萬行?》,作者: GaussDB 資料庫 ,

最近看到一篇《我說MySQL每張表最好不要超過2000萬資料,面試官讓我回去等通知》的文章,非常有趣,

文中提到,他朋友在面試的程序中說,自己的作業就是把用戶操作資訊存到MySQL里,因為資料量超大(5000萬條左右),需要每天定時生成3張表,然后將資料取模分別存到這三張表里,

下面是兩人的對話:

面試后續暫且不論,不過,互聯網江湖上的確流傳著一個說法:單表資料量超過500萬行時就要進行分表分庫,已經超過2000萬行時MySQL的性能就會急劇下降,

那么,MySQL一張表最多能存多少資料?

今天我們就從技術層面剖析一下,MySQL單表資料不能過大的根本原因是什么?

猜想一:是索引深度嗎?

很多人認為:資料量超過500萬行或2000萬行時,引起B+tree的高度增加,延長了索引的搜索路徑,進而導致了性能下降,事實果真如此嗎?

我們先理一下關系,MySQL采用了索引組織表的形式組織資料,葉子節點存盤資料,非葉子節點存盤主鍵與頁面號的映射關系,若用戶的主鍵長度是8位元組時,MySQL中頁面偏移占4個位元組,在非葉子節點的時候實際上是8+4=12個位元組,12個位元組表示一個頁面的映射關系,

MySQL默認是16K的頁面,拋開它的配置header,大概就是15K,因此,非葉子節點的索引頁面可放15*1024/12=1280條資料,按照每行1K計算,每個葉子節點可以存15條資料,同理,三層就是15*1280*1280=24576000條資料,只有資料量達到24576000條時,深度才會增加為4,所以,索引深度沒有那么容易增加,詳細資料可參考下表:

搜索路徑延長導致性能下降的說法,與當時的機械硬碟和記憶體條件不無關系,

之前機械硬碟的IOPS在100左右,而現在普遍使用的SSD的IOPS已經過萬,之前的記憶體最大幾十G,現在服務器記憶體最大可達到TB級,

因此,即使深度增加,以目前的硬體資源,IO也不會成為限制MySQL單表資料量的根本性因素,

那么,限制MySQL單表不能過大的根本性因素是什么?

猜想二:是SMO無法并發嗎?

我們可以嘗試從MySQL所采用的存盤引擎InnoDB本身來探究一下,

大家知道InnoDB引擎使用的是索引組織表,它是通過索引來組織資料的,而它采用B+tree作為索引的資料結構,

B+Tree操作非原子,所以當一個執行緒做結構調整(SMO,Struction-Modification-Operation)時一般會涉及多個節點的改動,

SMO動作程序中,此時若有另一個執行緒進來可能會訪問到錯誤的B+Tree結構,InnoDB為了解決這個問題采用了樂觀鎖和悲觀鎖的并發控制協議,

InnoDB對于葉子節點的修改操作如下:

方式一,先采用樂觀鎖的方式嘗試進行修改

對根節點加S鎖(shared lock,叫共享鎖,也稱讀鎖),依次對非葉子節點加S鎖,

如果葉子節點的修改不會引起B+Tree結構變動,如分裂、合并等操作,那么只需要對葉子節點進行加X鎖(exclusive lock,叫排他鎖,也稱為寫鎖)即可完成修改,如下圖中所示 :

方式二,采用悲觀鎖的方式

如果對葉子結點的修改會觸發SMO,那么會采用悲觀鎖的方式,

采用悲觀鎖,需要重新遍歷B+Tree,對根節點加全域SX鎖(SX鎖是行鎖),然后從根節點到葉子節點可能修改的節點加X鎖,

在整個SMO程序中,根節點始終持有SX鎖(SX鎖表示有意向修改這個保護的范圍,SX鎖與SX鎖、X鎖沖突,與S鎖不沖突),此時其他的SMO則需要等待,

因此,InnoDB對于簡單的主鍵查詢比較快,因為資料都存盤在葉子節點中,但對于資料量大且改操作比較多的TP型業務,并發會有很嚴重的瓶頸問題,

在對葉子節點的修改操作中,InnoDB可以實作較好的1與1、1與2的并發,但是無法解決2的并發,因為在方式2中,根節點始終持有SX鎖,必須串行執行,等待上一個SMO操作完成,這樣在具有大量的SMO操作時,InnoDB的B+Tree實作就會出現很嚴重的性能瓶頸,

解決方案

目前業界有一個更好的方案B-Link Tree,與B+Tree相比,B-Link Tree優化了B+Tree結構調整時的鎖粒度,只需要逐層加鎖,無需對root節點加全域鎖,因此,可以做到在SMO程序中寫操作的并發執行,保持高并發下性能的穩定,

B-Link Tree主要改進點有2個:

1.中間節點增加link指標,指向右兄弟節點;

2.每個節點內增加欄位high key,存盤該節點中最大的key值,

新增的link指標是為了解決SMO程序中并發寫的問題,在SMO程序中,B-Link Tree對修改節點逐層加鎖,修改完一層即可放鎖,然后去加上一層節點的鎖繼續修改,這樣在InnoDB引擎中被SMO阻塞的寫操作可以有機會在SMO操作程序中并發進行,

如下圖所示,在節點2分裂為節點2和4的程序中,只需要在最后一步將父節點1指向新節點4時,對父節點1加鎖,其他操作均無需對父節點加鎖,更無需對root節點加鎖,因此,大大提升了SMO程序中寫操作的并發度,

由此可見,與B+Tree全域加鎖對比,B-Link Tree在高并發操作下的性能是顯著優于B+Tree的,GaussDB當前采用的就是B-Link Tree索引資料結構,

InnoDB的索引組織表更容易觸發SMO

索引組織表的葉子節點,存盤主鍵以及應對行的資料,InnoDB默認頁面為16K,若每行資料的大小為1000位元組,每個葉子節點僅能存盤16行資料,

在索引組織表中,當葉子節點的扇出值過低時,SMO的觸發將更加頻繁,進而放大了SMO無法并發寫的缺陷,

目前業界有一個堆組織表的資料組織方案,也是華為云資料庫GaussDB采用的方案,它的葉子節點存盤索引鍵以及對應的行指標(所在的頁面編號及頁內偏移),堆組織表葉子節點可以存更多的資料,分析可得在同樣的資料量與業務并發量下,堆組織表會比索引組織表發生SMO概率低許多,

性能對比

在8U32G的兩臺服務器分別搭建了MySQL(B+Tree和索引組織表)與GaussDB(B-Link Tree和堆組織表)的環境,進行了如下性能驗證:

實驗場景:在基礎表的場景上,測驗增量隨機插入性能,

1.基礎表總大小10G,包含主鍵隨機分布的1000w行資料,每行資料1k;

2.插入主鍵隨機分布的1000w行資料,每行資料大小1k,測驗并發插入性能,

結論:隨著并發數的上升,GaussDB能穩步提升系統的TPS,而MySQL并發數的提高并不能帶來TPS的顯著提升,

綜上所述,MySQL無法支持大資料量下并發修改的根本原因,是由于其索引并發控制協議的缺陷造成的,而MySQL選擇索引組織表,又放大了這一缺陷,所以,開源MySQL資料庫更適用于主鍵查詢為主的簡單業務場景,如互聯網類應用,對于復雜的商業場景限制比較明顯,

相比之下 ,采用B-Link Tree和堆組織表的GaussDB資料庫在性能和場景應用方面更勝一籌,

 

點擊關注,第一時間了解華為云新鮮技術~

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/553142.html

標籤:其他

上一篇:Redis - 二進制位陣列

下一篇:返回列表

標籤雲
其他(159515) Python(38162) JavaScript(25443) Java(18096) C(15230) 區塊鏈(8267) C#(7972) AI(7469) 爪哇(7425) MySQL(7207) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5871) 数组(5741) R(5409) Linux(5340) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4574) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2433) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1975) 功能(1967) Web開發(1951) HtmlCss(1940) C++(1919) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1878) .NETCore(1861) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • 為什么MySQL單表不能超過2000萬行?

    摘要:MySQL一張表最多能存多少資料? 本文分享自華為云社區《為什么MySQL單表不能超過2000萬行?》,作者: GaussDB 資料庫 。 最近看到一篇《我說MySQL每張表最好不要超過2000萬資料,面試官讓我回去等通知》的文章,非常有趣。 文中提到,他朋友在面試的程序中說,自己的作業就是把 ......

    uj5u.com 2023-05-23 09:43:51 more
  • Redis - 二進制位陣列

    數學上有一個“計算漢明重量”的問題,即求取一個二進制位中非 0 的數量。使用 Redis 提供的 Bitmap 統計時恰恰是這樣一個問題,學習后能發現解決辦法卻是如此巧妙。 ......

    uj5u.com 2023-05-23 09:43:39 more
  • Redis單機部署

    # Redis單機部署 ## 1 安裝 下載最新穩定版Redis https://download.redis.io/redis-stable.tar.gz ```shell # 安裝wget yum install -y wget # 安裝gcc環境 yum install gcc-c++ # 獲 ......

    uj5u.com 2023-05-23 09:43:31 more
  • MySQL 并行復制方案演進歷史及原理分析

    有過線上 MySQL 維護經驗的童鞋都知道,主從延遲往往是一個讓人頭疼不已的問題。



    不僅僅是其造成的潛在問題比較嚴重,而且主從延遲原因的定位尤其考量 DBA 的綜合能力:既要熟悉復制的內部原理,又能解讀主機層面的資源使用情況,甚至還要會分析 binlog。



    導致主從延遲的一個常見原因是,... ......

    uj5u.com 2023-05-23 09:43:20 more
  • 看完這篇,DWS故障修復不再愁

    摘要:本文詳細梳理分析了DWS服務面臨軟硬體故障場景和對應的修復原理,希望借此能夠讓你對DWS的集群故障修復有個全面深入的了解。 本文分享自華為云社區《GaussDB(DWS)故障修復系統性介紹》,作者: 聞鮮生。 DWS是一個分布式架構的MPP集群,物理部署上涉及數百數千臺主機和對應的磁盤,以及這 ......

    uj5u.com 2023-05-23 09:42:48 more
  • Redis安裝,主從復制、哨兵模式、集群

    淺淺的記錄下Redis安裝、主從、哨兵、集群。搭建筆記 一.Redis下載安裝 系統環境 redis版本:7.0.11 linux版本:CentOS Linux release 8.2.2004 (Core) 官網下載地址:https://redis.io/download/ 一些安裝命令,按照步驟 ......

    uj5u.com 2023-05-23 09:37:25 more
  • Redis - 二進制位陣列

    數學上有一個“計算漢明重量”的問題,即求取一個二進制位中非 0 的數量。使用 Redis 提供的 Bitmap 統計時恰恰是這樣一個問題,學習后能發現解決辦法卻是如此巧妙。 ......

    uj5u.com 2023-05-23 09:31:42 more
  • Redis單機部署

    # Redis單機部署 ## 1 安裝 下載最新穩定版Redis https://download.redis.io/redis-stable.tar.gz ```shell # 安裝wget yum install -y wget # 安裝gcc環境 yum install gcc-c++ # 獲 ......

    uj5u.com 2023-05-23 09:31:34 more
  • 小白零基礎在 Centos 7 中安裝 mysql

    本文參考這三篇博文,安裝,修改配置,修改密碼。感謝大佬的分享 首先安裝好Centos,并使用xshell連接 一、下載 1、下載安裝檔案 建議自己到這個地址下載 https://dev.mysql.com/downloads/mysql/。選擇以下版本 2、下載完后上傳到系統,并解壓,可以用 tar ......

    uj5u.com 2023-05-23 09:31:17 more
  • 線上問題處理案例:出乎意料的資料庫連接池

    本文是線上問題處理案例系列之一,旨在通過真實案例向讀者介紹發現問題、定位問題、解決問題的方法。本文講述了從垃圾回收耗時過長的表象,逐步定位到資料庫連接池保活問題的全程序,并對其中用到的一些知識點進行了總結。 ......

    uj5u.com 2023-05-23 09:31:11 more