資料庫表占用空間過大 架構學習系列 資料庫分庫分表

2021-10-14 17:50:10 字數 2178 閱讀 6416

讀寫分離主要是分散了資料庫讀寫的壓力,但是並沒有分散資料儲存的壓力,當資料過大的時候,單台伺服器儲存的能力會成為系統的瓶頸。

主要體現在:

資料量太大,讀寫效能下降。即使有索引,效能依舊會下降。

資料檔案會變的很大,資料庫備份和恢復耗時會很長。

資料檔案越大,極端情況丟失資料的風險越高。

所以,單台伺服器資料儲存不宜過大,需要控制在一定的範圍內。為滿足資料儲存需求,就需要將資料分散儲存到不同的資料庫中。

常見的分散儲存方式有分庫和分表。

業務分庫是指按照業務模組將資料分散到不同的資料庫伺服器。比如在電商系統中,我們可以把商品、使用者、訂單等資料分別儲存到不同的伺服器資料庫上。

分庫可以降低資料儲存壓力和讀寫壓力,但同樣也會帶來其他新的應用問題:

1、join操作問題。 在單台資料庫中,不考慮效能問題,join 隨時可以根據需要使用;但如果資料儲存在不同的資料庫中,join就沒用武之地了,只能分開單個語句去查詢了。

2、事物問題。 單台資料庫同乙個庫中不同的表做修改,我們可以通過同乙個事物保證資料的最終一致性,但現在多台資料庫的表沒有在一起,就無法通過事物同意修改,所以需要程式模擬實現事物。

3、成本問題。 本來一台可以搞定的事情,分庫後需要兩台,四台甚至更多的資料庫伺服器。

應不應該分庫?

如果是初創公司,並不建議一開始就拆分,原因如下:

1、初創業務不確定因素很大,業務未來發展有很大的疑問,並且一開始並沒有儲存和訪問的壓力,現在直接上手分庫,對成本是一種大的消耗,不僅體現在硬體成本,還有人力成本。

2、業務分局後,簡單的join就無法實現,需要程式去實現,從而增加不可控因素。

3、工作量增加。分庫的邏輯,業務的實現方式,導致前期消耗過多的時間。而創業初期,時間尤為重要。

如果是成熟的公司業務重構,有大量的資料基礎 ,有成熟的業務分庫的方案,並且已經滿足不了現在的業務需求,那麼建議可以使用分庫的方式來分散業務資料的儲存。

每乙個架構師心裡都有一種技術情節,希望自己設計的系統高效能,高可用,高擴充套件,一步登天,設計過分完美的方案。而根據架構設計三原則的演進原則,每乙個架構都是通過不斷迭代來完善的。如果我們初期設計的方案不能滿足現在業務的需求,那麼,這個時候在進行分庫分表也不遲。

將不同業務資料分散儲存到不同的資料庫伺服器,減輕單庫的儲存壓力,同樣同一業務的單錶資料也會達到單台資料庫伺服器的處理瓶頸。例如,過億使用者的儲存,全部放在一張表裡,肯定無法滿足效能的要求的,所以,就會涉及到對單錶的拆分。

單錶資料拆分有兩種方式:垂直分表和水平分表。

水平分表:就是對資料表中的資料進行切分,儲存的字段一致,儲存的資料不同。

單錶進行切分後,可以將多表存在相同的資料庫伺服器中,也可以儲存在不同的資料庫伺服器,可以根據我們的實際情況來確定。

分表能夠有效的分散單錶的儲存壓力,並帶來可觀的效能提公升,但是,避不可免會帶來一些操作複雜性。

垂直分表

垂直分表適合將一些不常用且占用大量空間或者使用率比較小的列拆分出來。而其複雜性主要體現在表運算元量要增加。儘管有些欄位不常用,但是一旦需要,則必會涉及到多張表的查詢。原本只需要一次查詢,現在就需要多次查詢才可以獲取完整資料。

水平分表

垂直分表的複雜性主要體現在了查詢次數上的增加,而水平分表的複雜性可就無比複雜了。首先,水平分表,我們可以要求單錶行數超過1000萬條或者2000萬條資料就需要分表。

那水平分表的複雜性主要體現在哪呢?

路由

水平分表後,資料怎麼儲存,哪些資料儲存在哪些子表中,這個就需要增加路由演算法來計算,常見的路由演算法有:

join操作

水平分表後,資料分散在多個表中,join查詢就需要多次join以後進行資料合併,或者通過資料庫中介軟體來處理。

count()操作

水平分表前,乙個count就能得到結果,分表後就需要進行特殊處理了。常見的主要有兩種方式:

order by 操作

同join一樣,排序無法在資料庫中完成,只有由業務**或者中介軟體來滿足了。

SQL Server 資料庫每個表占用的空間 大小

檢視mssql資料庫每個表占用的空間大小 sp spaceused 顯示行數 保留的磁碟空間以及當前資料庫中的表所使用的磁碟空間,或顯示由整個資料庫保留和使用的磁碟空間。語法sp spaceused objname objname updateusage updateusage 引數 objname...

Mysql資料庫及表空間占用資訊統計

1 mysql中檢視各表的大小 這裡用到乙個表,information schema.tables 對應主要字段含義如下 able schema 資料庫名 table name 表名 engine 所使用的儲存引擎 tables rows 記錄數 data length 資料大小 index len...

查詢資料庫中每個表占用空間方法

1.執行如下儲存過程 create procedure dbo sys viewtablespace asbegin set nocount on create table dbo tableinfo 表名 varchar 50 collate chinese prc ci as null,記錄數 ...