在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

MySQL處理大數據表的3種方案

jf_ro2CN3Fa ? 來源:稀土掘金 ? 2023-04-17 10:23 ? 次閱讀

場景

當我們業務數據庫表中的數據越來越多,如果你也和我遇到了以下類似場景,那讓我們一起來解決這個問題

數據的插入,查詢時長較長

后續業務需求的擴展 在表中新增字段 影響較大

表中的數據并不是所有的都為有效數據 需求只查詢時間區間內的

評估表數據體量

我們可以從表容量/磁盤空間/實例容量三方面評估數據體量,接下來讓我們分別展開來看看

表容量

表容量主要從表的記錄數、平均長度、增長量、讀寫量、總大小量進行評估。一般對于OLTP的表,建議單表不要超過2000W行數據量,總大小15G以內。訪問量:單表讀寫量在1600/s以內

查詢行數據的方式:我們一般查詢表數據有多少數據時用到的經典sql語句如下:

selectcount(*)fromtable
selectcount(1)fromtable

但是當數據量過大的時候,這樣的查詢就可能會超時,所以我們要換一種查詢方式

use庫名
showtablestatuslike'表名';
或:showtablestatuslike'表名'G;

上述方法不僅可以查詢表的數據,還可以輸出表的詳細信息 , 加 G 可以格式化輸出。包括表名 存儲引擎 版本 行數 每行的字節數等等,大家可以自行試一下哈

磁盤空間

查看指定數據庫容量大小

select
table_schemaas'數據庫',
table_nameas'表名',
table_rowsas'記錄數',
truncate(data_length/1024/1024,2)as'數據容量(MB)',
truncate(index_length/1024/1024,2)as'索引容量(MB)'
frominformation_schema.tables
orderbydata_lengthdesc,index_lengthdesc;

查詢單個庫中所有表磁盤占用大小

select
table_schemaas'數據庫',
table_nameas'表名',
table_rowsas'記錄數',
truncate(data_length/1024/1024,2)as'數據容量(MB)',
truncate(index_length/1024/1024,2)as'索引容量(MB)'
frominformation_schema.tables
wheretable_schema='mysql'
orderbydata_lengthdesc,index_lengthdesc;

查詢出的結果如下:

ce8af8da-dcc0-11ed-bfe3-dac502259ad0.jpg

建議數據量占磁盤使用率的70%以內。同時,對于一些數據增長較快,可以考慮使用大的慢盤進行數據歸檔(歸檔可以參考方案三)

實例容量

MySQL是基于線程的服務模型,因此在一些并發較高的場景下,單實例并不能充分利用服務器的CPU資源,吞吐量反而會卡在mysql層,可以根據業務考慮自己的實例模式

出現問題的原因

上面我們已經查到我們數據表的體量了 那么為什么單表數據量越大 業務的執行效率就越慢 根本原因是什么呢?

一個表的數據量達到好幾千萬或者上億時,加索引的效果沒那么明顯啦。性能之所以會變差,是因為維護索引的B+樹結構層級變得更高了,查詢一條數據時,需要經歷的磁盤IO變多,因此查詢性能變慢。

?

大家是否還記得,一個B+樹大概可以存放多少數據量呢?

?

InnoDB存儲引擎最小儲存單元是頁,一頁大小就是16k。

B+樹葉子存的是數據,內部節點存的是鍵值+指針。索引組織表通過非葉子節點的二分查找法以及指針確定數據在哪個頁中,進而再去數據頁中找到需要的數據;

ce9c69d0-dcc0-11ed-bfe3-dac502259ad0.jpg

假設B+樹的高度為2的話,即有一個根結點和若干個葉子結點。這棵B+樹的存放總記錄數為=根結點指針數*單個葉子節點記錄行數。

如果一行記錄的數據大小為1k,那么單個葉子節點可以存的記錄數 =16k/1k =16.

非葉子節點內存放多少指針呢?我們假設主鍵ID為bigint類型,長度為8字節(面試官問你int類型,一個int就是32位,4字節),而指針大小在InnoDB源碼中設置為6字節,所以就是8+6=14字節,16k/14B =16*1024B/14B = 1170

因此,一棵高度為2的B+樹,能存放1170 * 16=18720條這樣的數據記錄。同理一棵高度為3的B+樹,能存放1170 *1170 *16 =21902400,也就是說,可以存放兩千萬左右的記錄。B+樹高度一般為1-3層,已經滿足千萬級別的數據存儲。

如果B+樹想存儲更多的數據,那樹結構層級就會更高,查詢一條數據時,需要經歷的磁盤IO變多,因此查詢性能變慢。

如何解決單表數據量太大,查詢變慢的問題

知道了根本原因之后,我們就需要考慮如何優化數據庫來解決問題了

這里提供了三種解決方案,包括數據表分區,分庫分表,冷熱數據歸檔 了解完這些方案之后大家可以選取適合自己業務的方案

方案一:數據表分區

為什么要分區:表分區可以在區間內查詢對應的數據,降低查詢范圍 并且索引分區 也可以進一步提高命中率,提升查詢效率 分區是指將一個表的數據按照條件分布到不同的文件上面,未分區前都是存放在一個文件上面的,但是它還是指向的同一張表,只是把數據分散到了不同文件而已。

我們首先看一下分區有什么優缺點:

表分區有什么好處?

與單個磁盤或文件系統分區相比,可以存儲更多的數據。

對于那些已經失去保存意義的數據,通常可以通過刪除與那些數據有關的分區,很容易地刪除那些數據。相反地,在某些情況下,添加新數據的過程又可以通過為那些新數據專門增加一個新的分區,來很方便地實現。

一些查詢可以得到極大的優化,這主要是借助于滿足一個給定WHERE語句的數據可以只保存在一個或多個分區內,這樣在查找時就不用查找其他剩余的分區。因為分區可以在創建了分區表后進行修改,所以在第一次配置分區方案時還不曾這么做時,可以重新組織數據,來提高那些常用查詢的效率。

涉及到例如SUM()和COUNT()這樣聚合函數的查詢,可以很容易地進行并行處理。這種查詢的一個簡單例子如 “SELECT salesperson_id, COUNT (orders) as order_total FROM sales GROUP BY salesperson_id;”。通過“并行”,這意味著該查詢可以在每個分區上同時進行,最終結果只需通過總計所有分區得到的結果。

通過跨多個磁盤來分散數據查詢,來獲得更大的查詢吞吐量。

表分區的限制因素

一個表最多只能有1024個分區。

MySQL5.1中,分區表達式必須是整數,或者返回整數的表達式。在MySQL5.5中提供了非整數表達式分區的支持。

如果分區字段中有主鍵或者唯一索引的列,那么多有主鍵列和唯一索引列都必須包含進來。即:分區字段要么不包含主鍵或者索引列,要么包含全部主鍵和索引列。

分區表中無法使用外鍵約束。

MySQL的分區適用于一個表的所有數據和索引,不能只對表數據分區而不對索引分區,也不能只對索引分區而不對表分區,也不能只對表的一部分數據分區。

在進行分區之前可以用如下方法 看下數據庫表是否支持分區哈

mysql>showvariableslike'%partition%';
+-------------------+-------+
|Variable_name|Value|
+-------------------+-------+
|have_partitioning|YES|
+-------------------+-------+
1rowinset(0.00sec)

方案二:數據庫分表

為什么要分表:分表后,顯而易見,單表數據量降低,樹的高度變低,查詢經歷的磁盤io變少,則可以提高效率 mysql 分表分為兩種 水平分表和垂直分表

分庫分表就是為了解決由于數據量過大而導致數據庫性能降低的問題,將原來獨立的數據庫拆分成若干數據庫組成 ,將數據大表拆分成若干數據表組成,使得單一數據庫、單一數據表的數據量變小,從而達到提升數據庫性能的目的。

水平分表

定義:數據表行的拆分,通俗點就是把數據按照某些規則拆分成多張表或者多個庫來存放。分為庫內分表和分庫。

比如一個表有4000萬數據,查詢很慢,可以分到四個表,每個表有1000萬數據

ceaf211a-dcc0-11ed-bfe3-dac502259ad0.jpg

垂直分表

定義:列的拆分,根據表之間的相關性進行拆分。常見的就是一個表把不常用的字段和常用的字段就行拆分,然后利用主鍵關聯。或者一個數據庫里面有訂單表和用戶表,數據量都很大,進行垂直拆分,用戶庫存用戶表的數據,訂單庫存訂單表的數據

cebb783e-dcc0-11ed-bfe3-dac502259ad0.jpg

缺點:垂直分隔的缺點比較明顯,數據不在一張表中,會增加join 或 union之類的操作

知道了兩個知識后,我們來看一下分庫分表的方案

1.取模方案:

拆分之前,先預估一下數據量。比如用戶表有4000w數據,現在要把這些數據分到4個表user1 user2 uesr3 user4。

比如id = 17,17對4取模為1,加上 ,所以這條數據存到user2表。

?

注意:進行水平拆分后的表要去掉auto_increment自增長。這時候的id可以用一個id 自增長臨時表獲得,或者使用 redis incr的方法。

?

cecc8e30-dcc0-11ed-bfe3-dac502259ad0.jpg

優點:數據均勻的分到各個表中,出現熱點問題的概率很低。

缺點:以后的數據擴容遷移比較困難難,當數據量變大之后,以前分到4個表現在要分到8個表,取模的值就變了,需要重新進行數據遷移。

2.range 范圍方案

以范圍進行拆分數據,就是在某個范圍內的訂單,存放到某個表中。比如id=12存放到user1表,id=1300萬的存放到user2 表。

cf270180-dcc0-11ed-bfe3-dac502259ad0.jpg

優點:有利于將來對數據的擴容

缺點:如果熱點數據都存在一個表中,則壓力都在一個表中,其他表沒有壓力。

?

我們看到以上兩種方案 都存在缺點 但是卻又是互補的,那么我們將這兩個方案結合會怎樣呢?

?

3.hash取模和range方案結合

如下圖 我們可以看到 group 組存放id 為0~4000萬的數據,然后有三個數據庫 DB0 DB1 DB2,DB0里面有四個數據庫,DB1 和DB2 有三個數據庫

假如id為15000 然后對10取模(為啥對10 取模 因為有10個表),取0 然后 落在DB_0,然后在根據range 范圍,落在Table_0 里面。

cf3e961a-dcc0-11ed-bfe3-dac502259ad0.jpg

總結:采用hash取模和range方案結合 既可以避免熱點數據的問題,也有利于將來對數據的擴容

我們已經了解了 mysql分區和分表的知識 那我們看一下這兩個技術有何不同以及適用場景

分區分表的區別

1、實現方式上

mysql的分表是真正的分表,一張表分成很多表后,每一個小表都是完整的一張表,都對應三個文件,一個.MYD數據文件,.MYI索引文件,.frm表結構

分區不一樣,一張大表進行分區后,他還是一張表,不會變成二張表,但是他存放數據的區塊變多了。

2、提高性能上

分表重點是存取數據時,如何提高mysql并發能力上;

而分區呢,如何突破磁盤的讀寫能力,從而達到提高mysql性能的目的。

3、實現的難易度上

1、分表的方法有很多,用merge來分表,是最簡單的一種方式。這種方式根分區難易度差不多,并且對程序代碼來說可以做到透明的。如果是用其他分表方式就比分區麻煩了。

2、分區實現是比較簡單的,建立分區表,根建平常的表沒什么區別,并且對開代碼端來說是透明的

分區分表的聯系

1、都能提高mysql的性高,在高并發狀態下都有一個良好的表現。

2、分表和分區不矛盾,可以相互配合的,對于那些大訪問量,并且表數據比較多的表,我們可以采取分表和分區結合的方式,訪問量不大,但是表數據很多的表,我們可以采取分區的方式等。

分庫分表存在的問題

1、事務問題

在執行分庫分表之后,由于數據存儲到了不同的庫上,數據庫事務管理出現了困難。如果依賴數據庫本身的分布式事務管理功能去執行事務,將付出高昂的性能代價;如果由應用程序去協助控制,形成程序邏輯上的事務,又會造成編程方面的負擔。

2、跨庫跨表的join問題

在執行了分庫分表之后,難以避免會將原本邏輯關聯性很強的數據劃分到不同的表、不同的庫上,這時,表的關聯操作將受到限制,我們無法join位于不同分庫的表,也無法join分表粒度不同的表,結果原本一次查詢能夠完成的業務,可能需要多次查詢才能完成。

3、額外的數據管理負擔和數據運算壓力

額外的數據管理負擔,最顯而易見的就是數據的定位問題和數據的增刪改查的重復執行問題,這些都可以通過應用程序解決,但必然引起額外的邏輯運算。

例如,對于一個記錄用戶成績的用戶數據表userTable,業務要求查出成績最好的100位,在進行分表之前,只需一個order by語句就可以搞定,但是在進行分表之后,將需要n個order by語句,分別查出每一個分表的前100名用戶數據,然后再對這些數據進行合并計算,才能得出結果。

方案三:冷熱歸檔

為什么要冷熱歸檔:其實原因和方案二類似,都是降低單表數據量,樹的高度變低,查詢經歷的磁盤io變少,則可以提高效率 如果大家的業務數據,有明顯的冷熱區分,比如:只需要展示近一周或一個月的數據。那么這種情況這一周喝一個月的數據我們稱之為熱數據,其余數據為冷數據。那么我們可以將冷數據歸檔在其他的庫表中,提高我們熱數據的操作效率。

接下來講一下歸檔的過程

創建歸檔表 創建的歸檔表 原則上要與原表保持一致

歸檔表數據的初始化

cf553460-dcc0-11ed-bfe3-dac502259ad0.jpg

業務增量數據處理過程

cf675a64-dcc0-11ed-bfe3-dac502259ad0.jpg

數據的獲取過程

cf75a286-dcc0-11ed-bfe3-dac502259ad0.jpg

以上三種方案我們如何選型

cf8b1062-dcc0-11ed-bfe3-dac502259ad0.png

大家可以根據自己的業務場景,去選擇合適自己業務的方案,我這邊就給大家提供一下思路~





審核編輯:劉清

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

    關注

    68

    文章

    10906

    瀏覽量

    213053
  • MySQL
    +關注

    關注

    1

    文章

    830

    瀏覽量

    26747
  • MYSQL數據庫
    +關注

    關注

    0

    文章

    96

    瀏覽量

    9457

原文標題:MySQL 處理大數據表的 3 種方案,寫的太好了,建議收藏!!

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    PSoC3-CY8C36系列數據表

    CY8C36x系列數據表:PSoC3具有獨特的可配置模塊陣列,是真正的系統級解決方案,能夠通過單個芯片提供MCU、存儲器、模擬和數字外設功能。CY8C36系列提供了一新型的信號采集、
    發表于 06-18 14:00

    MySQL筆記和小練習

    嚴格區分大小寫。tee命令:可以將MySQL中的練習語句導出到外部的一個文件當中使用方法:tee E:\wamp\www\lamp156\lesson23_MySQL01\test.txt10. 對數據表
    發表于 06-27 08:45

    常見大數據應用有哪些?

    數據采集階段大數據數據采集階段需掌握的技術有:Python、Scala。六、大數據商業實戰階段大數據商業實戰階段需掌握的技術有:實操企業
    發表于 03-13 16:50

    Sql過濾重復數據處理方法

    對于常規的MySQL數據表中可能存在重復的數據,有些情況是允許重復數據的存在,有些情況是不允許的,這個時候我們就需要查找并刪除這些重復數據
    發表于 03-21 14:46

    大數據專業技術學習之大數據處理流程

    隨著互聯網的發展,大數據也在逐漸彰顯出自己的優勢特點,那么關于大數據處理流程,你是否了解?第一,數據采集定義:利用多種輕型數據庫來接收發自
    發表于 06-11 16:41

    MySQL分區類型及介紹

    確定每個分區包含的數據3.HASH分區:哈希分區,按照一個自定義的函數返回值來確定每個分區包含的數據; 4.KEY
    發表于 06-29 16:31

    DKH企業級大數據解決方案的優勢分析

    ,實現大數據的跨平臺整合管控。 DKH大數據解決方案優勢:1、數據互聯互通,支持多數據集實時同步;2、支持
    發表于 11-02 13:25

    設備管理解決方案數據表

    設備管理解決方案數據表,209 KB
    發表于 05-23 16:17

    mysql數據庫優化方案

    MySQL千萬級大優化解決方案
    發表于 08-19 12:18

    為什么BLE的數據表中需要兩服務?

    在BLE的數據表中,我讀到有2類型的服務:服務型?初級–代表該設備的主要功能。?二–代表該設備的一個附加功能。這到底是什么意思?為什么需要二次型?為什么不直接使用呢?
    發表于 11-06 06:33

    什么是大數據大數據的特點有哪些

    大數據(big data)目錄1什么是大數據2大數據的定義3大數據的特點[1]4大數據的作用[2
    發表于 07-12 06:52

    MySQL批量插入數據的四方案(性能測試對比)

    本文記錄個人使用MySQL插入大數據總結較實用的方案,通過對常用插入大數據的4方式進行測試,即for循環單條、拼接SQL、批量插入save
    的頭像 發表于 10-28 09:43 ?2784次閱讀

    MySQL到ES的4常用數據同步方案

    如何實現 MySQL 數據庫和 ES 的數據同步,今天和大家聊聊 MySQL 和 ES 數據同步的各種
    發表于 08-09 11:36 ?685次閱讀
    <b class='flag-5'>MySQL</b>到ES的4<b class='flag-5'>種</b>常用<b class='flag-5'>數據</b>同步<b class='flag-5'>方案</b>

    mysql一個能存多少數據

    mysql一個能存多少數據 MySQL是一關系型數據庫管理系統(RDBMS),它允許用戶在計
    的頭像 發表于 08-28 17:15 ?1021次閱讀

    mysql數據庫如何創建數據表

    MySQL是一常用的關系型數據庫管理系統,可以用于創建和管理數據表。下面是一篇詳細的關于MySQL數據
    的頭像 發表于 11-21 11:08 ?1883次閱讀
    主站蜘蛛池模板: 国产三级在线看 | 欧美大片一区二区三区 | 天天综合天天做 | 一级中文字幕乱码免费 | 亚洲福利二区 | 日韩三级视频在线观看 | 特级毛片s级全部免费 | 五月香婷婷 | 免费看黄在线 | 亚洲色图欧美视频 | 在线天堂中文新版www | 黄色一级日本 | 日本jlzz | 97成人免费视频 | 欧美午夜寂寞影院安卓列表 | 国产免费一区二区三区在线 | 欧美ol丝袜高跟秘书在线播放 | 日本三级在线视频 | 久色99| 最刺激黄a大片免费网站 | 91天天操 | 夭天干天天做天天免费看 | 国产一区中文字幕 | 一区二区三区免费在线 | 亚洲视频福利 | 国语自产自拍秒拍在线视频 | 欧美高清老少配性啪啪 | 国产理论在线 | 天天精品在线 | 激情五月宗合网 | 欧美一级第一免费高清 | 久草干| 四虎美女 | 亚洲特级aaaaaa毛片 | 国产色丁香久久综合 | 色91视频| 韩国精品videosex性韩国 | 狠狠色噜噜狠狠狠狠黑人 | bt天堂在线www中文在线 | 五月天激情在线 | 精品久久香蕉国产线看观看亚洲 |