存儲分庫分表
Ⅰ 資料庫為什麼分庫分表
資料庫涉及各種領域。即使同一領域也有不同需求,且有各種資料庫軟體,分庫是很正常的。一個資料庫內需要各種關系表,來避免冗餘信息,使得資料庫儲存、檢索效率提高。
資料庫(Database)是按照數據結構來組織、存儲和管理數據的倉庫,它產生於距今六十多年前,隨著信息技術和市場的發展,特別是二十世紀九十年代以後,數據管理不再僅僅是存儲和管理數據,而轉變成用戶所需要的各種數據管理的方式。資料庫有很多種類型,從最簡單的存儲有各種數據的表格到能夠進行海量數據存儲的大型資料庫系統都在各個方面得到了廣泛的應用。
在信息化社會,充分有效地管理和利用各類信息資源,是進行科學研究和決策管理的前提條件。資料庫技術是管理信息系統、辦公自動化系統、決策支持系統等各類信息系統的核心部分,是進行科學研究和決策管理的重要技術手段。
Ⅱ 大數據量最近的存儲分表常見演算法
大數據量最近的存儲分表常見演算法
當一個應用的數據量大的時候,我們用單表和單庫來存儲會嚴重影響操作速度,如mysql的myisam存儲,我們經過測試,200w以下的時候,mysql的訪問速度都很快,但是如果超過200w以上的數據,他的訪問速度會急劇下降,影響到我們webapp的訪問速度,而且數據量太大的話,如果用單表存儲,就會使得系統相當的不穩定,mysql服務很容易掛掉。所以當數據量超過200w的時候,建議系統工程師還是考慮分表.
以下是幾種常見的分表演算法。
1.按自然時間來分表/分庫;
如一個應用的數據在一年後數據量會達到200w左右,那麼我們就可以考慮用一年的數據來做為一個表或者庫來存儲,例如,表名為app,那麼2010年的數據就是app_2010,app_2011;如果數據量在一個月就達到了200w左右,那麼我們就可以用月份來分,app_2010_01,app_2010_02.
2.按數字類型hash分表/分庫;
如果我們要存儲用戶的信息,我們應用的注冊量很大,我們用單表是不能滿足存儲需求的,那麼我們就可以用用戶的編號來進行hash,常見的是用取余操作,如果我們要分30張表來存儲用戶的信息,那麼用戶編號為1的用戶1%30=1,那麼我們就存在user_01表裡,如用戶的編號為500,那麼500%30=20,那麼我們就將此用戶的信息存儲在user_20的表裡.
3.按md5值來分表/分庫;
我們假設要存儲用戶上傳的文件,如果上傳量大的話,也會帶來系統的瓶頸問題,我們做過試驗,在一個文件夾下如果超過200個文件的話,文件的瀏覽效率會降低,當然,這個不屬於我們本文討論的范圍,這塊也要做散列操作.我們可以用文件的用戶名來md5或者用文件的md5校驗值來做,我們就可以用md5的前5位來做hash,這樣最多我們就可以得到5^5=3125個表,每次在存儲文件的時候,就可以用文件名的md5值的前5位來確定這個文件該存那張表.
4.實例:某微博的url加密演算法和存儲策略的猜想.
現在好多微博都用這樣的url來訪問,如果他們的域名為www.example.com,那麼如果你發微博的時候,你會發現你所發的url都變成了http://t.cn/Mx4ja1,這樣的形式,他們是怎麼進行這樣的轉換呢?我猜想就是用到了我們上面講的md5的存儲和查找規則,用你發的url來進行md5,得到md5值之後,如我們例子來說,就會用前6位來進行分表.
5.分表所帶來的問題.
分表也會帶來一系列的問題,如分頁的實現,統計的實現,如果我們要做一個所有數據的分頁,那麼我們得每張表都得遍歷一遍,這樣訪問效率會很低下.之前我嘗試過用mysql的代理來實現,最終用tcsql來實現了.
6.分表演算法的選擇.
首先,分表適合於沒有大的列表的應用來使用,要不然,會為這部分做好多額外的工作,如果你的應用數據量不是特別大的話,最好別用分表。7.針對每秒插入數據500+的設想為什麼要這個呢,因為很多資料庫在數據上千萬級別後,每秒插入數據的數度不是很快了,所以500/秒的速度夠嗆,解決方案設想:建立數據總表及兩個緩沖表,結構完全相同,將數據先插入其中一個緩沖表中,等到一定時間(插入效率降低之前),轉向插入另一個緩沖表,同時啟動一個後台進程將第
一個緩沖表的的數據轉入總表,轉入總表後刪除第一個緩沖表中的數據; 再等到一定時間(還是插入效率降低之前),轉向插入第一個緩沖表,這時啟動一個後台進程將第
二個緩沖表的的數據轉入總表,轉入總表後刪除第二個緩沖表中的數據; 如此循環往復...
如果後台進程處理的時間超過兩個緩沖表的循環周期的話,甚至可以考慮建立三個乃至四個緩沖表。
這僅僅是解決插入效率,查詢什麼的問題也大。
Ⅲ 資料庫分區和分表的區別
分區、分表、分庫的詳細理解
一、什麼是分區、分表、分庫
分區
就是把一張表的數據分成N個區塊,在邏輯上看最終只是一張表,但底層是由N個物理區塊組成的
分表
就是把一張表按一定的規則分解成N個具有獨立存儲空間的實體表。系統讀寫時需要根據定義好的規則得到對應的字表明,然後操作它。
分庫
一旦分表,一個庫中的表會越來越多
將整個資料庫比作圖書館,一張表就是一本書。當要在一本書中查找某項內容時,如果不分章節,查找的效率將會下降。而同理,在資料庫中就是分區。
二、常用的單機資料庫的瓶頸
問題描述
單個表數據量越大,讀寫鎖,插入操作重新建立索引效率越低。
單個庫數據量太大(一個資料庫數據量到就是極限)
單個資料庫伺服器壓力過大
讀寫速度遇到瓶頸(並發量幾百)
三、分區
什麼時候考慮使用分區?
一張表的查詢速度已經慢到影響使用的時候。
sql經過優化
數據量大
表中的數據是分段的
對數據的操作往往只涉及一部分數據,而不是所有的數據
分區解決的問題
主要可以提升查詢效率
分區的實現方式(簡單)
mysql5 開始支持分區功能
四、分表
什麼時候考慮分表?
一張表的查詢速度已經慢到影響使用的時候。
sql經過優化
數據量大
當頻繁插入或者聯合查詢時,速度變慢
分表解決的問題
分表後,單表的並發能力提高了,磁碟I/O性能也提高了,寫操作效率提高了
查詢一次的時間短了
數據分布在不同的文件,磁碟I/O性能提高
讀寫鎖影響的數據量變小
插入資料庫需要重新建立索引的數據減少
分表的實現方式(復雜)
需要業務系統配合遷移升級,工作量較大
分區和分表的區別與聯系
分區和分表的目的都是減少資料庫的負擔,提高表的增刪改查效率。
分區只是一張表中的數據的存儲位置發生改變,分表是將一張表分成多張表。
當訪問量大,且表數據比較大時,兩種方式可以互相配合使用。
當訪問量不大,但表數據比較多時,可以只進行分區。
常見分區分表的規則策略(類似)
Range(范圍)
Hash(哈希)
按照時間拆分
Hash之後按照分表個數取模
在認證庫中保存資料庫配置,就是建立一個DB,這個DB單獨保存user_id到DB的映射關系
Ⅳ 如何實現mysql的分庫分表
1,接收到sql;2,把sql放到排隊隊列中 ;3,執行sql;4,返回執行結果。在這個執行過程中最花時間在什麼地方呢?第一,是排隊等待的時間,第二,sql的執行時間。其實這二個是一回事,等待的同時,肯定有sql在執行。所以我們要縮短sql的執行時間。
mysql中有一種機制是表鎖定和行鎖定,為什麼要出現這種機制,是為了保證數據的完整 性,我舉個例子來說吧,如果有二個sql都要修改同一張表的同一條數據,這個時候怎麼辦呢,是不是二個sql都可以同時修改這條數據呢?很顯然mysql 對這種情況的處理是,一種是表鎖定(myisam存儲引擎),一個是行鎖定(innodb存儲引擎)。表鎖定表示你們都不能對這張表進行操作,必須等我對 表操作完才行。行鎖定也一樣,別的sql必須等我對這條數據操作完了,才能對這條數據進行操作。如果數據太多,一次執行的時間太長,等待的時間就越長,這 也是我們為什麼要分表的原因。
Ⅳ MySQL優化分庫分表,為什麼要分表,分表以後
1 基本思想之什麼是分庫分表?
從字面上簡單理解,就是把原本存儲於一個庫的數據分塊存儲到多個庫上,把原本存儲於一個表的數據分塊存儲到多個表上。
2 基本思想之為什麼要分庫分表?
資料庫中的數據量不一定是可控的,在未進行分庫分表的情況下,隨著時間和業務的發展,庫中的表會越來越多,表中的數據量也會越來越大,相應地,數據操作,增刪改查的開銷也會越來越大;另外,由於無法進行分布式式部署,而一台伺服器的資源(CPU、磁碟、內存、IO等)是有限的,最終資料庫所能承載的數據量、數據處理能力都將遭遇瓶頸。
Ⅵ 資料庫為什麼要分庫分表,資料庫分庫分表
1 基本思想之什麼是分庫分表?
從字面上簡單理解,就是把原本存儲於一個庫的數據分塊存儲到多個庫上,把原本存儲於一個表的數據分塊存儲到多個表上。
2 基本思想之為什麼要分庫分表?
數
據庫中的數據量不一定是可控的,在未進行分庫分表的情況下,隨著時間和業務的發展,庫中的表會越來越多,表中的數據量也會越來越大,相應地,數據操作,增
刪改查的開銷也會越來越大;另外,由於無法進行分布式式部署,而一台伺服器的資源(CPU、磁碟、內存、IO等)是有限的,最終資料庫所能承載的數據量、
數據處理能力都將遭遇瓶頸。
3 分庫分表的實施策略。
分庫分表有垂直切分和水平切分兩種。
3.1
何謂垂直切分,即將表按照功能模塊、關系密切程度劃分出來,部署到不同的庫上。例如,我們會建立定義資料庫workDB、商品資料庫payDB、用戶數據
庫userDB、日誌資料庫logDB等,分別用於存儲項目數據定義表、商品定義表、用戶數據表、日誌數據表等。
3.2
何謂水平切分,當一個表中的數據量過大時,我們可以把該表的數據按照某種規則,例如userID散列,進行劃分,然後存儲到多個結構相同的表,和不同的庫
上。例如,我們的userDB中的用戶數據表中,每一個表的數據量都很大,就可以把userDB切分為結構相同的多個userDB:part0DB、
part1DB等,再將userDB上的用戶數據表userTable,切分為很多userTable:userTable0、userTable1等,
然後將這些表按照一定的規則存儲到多個userDB上。
3.3 應該使用哪一種方式來實施資料庫分庫分表,這要看資料庫中數據量的瓶頸所在,並綜合項目的業務類型進行考慮。
如果資料庫是因為表太多而造成海量數據,並且項目的各項業務邏輯劃分清晰、低耦合,那麼規則簡單明了、容易實施的垂直切分必是首選。
而
如果資料庫中的表並不多,但單表的數據量很大、或數據熱度很高,這種情況之下就應該選擇水平切分,水平切分比垂直切分要復雜一些,它將原本邏輯上屬於一體
的數據進行了物理分割,除了在分割時要對分割的粒度做好評估,考慮數據平均和負載平均,後期也將對項目人員及應用程序產生額外的數據管理負擔。
在現實項目中,往往是這兩種情況兼而有之,這就需要做出權衡,甚至既需要垂直切分,又需要水平切分。我們的游戲項目便綜合使用了垂直與水平切分,我們首先對資料庫進行垂直切分,然後,再針對一部分表,通常是用戶數據表,進行水平切分。
4 分庫分表存在的問題。
4.1 事務問題。
在執行分庫分表之後,由於數據存儲到了不同的庫上,資料庫事務管理出現了困難。如果依賴資料庫本身的分布式事務管理功能去執行事務,將付出高昂的性能代價;如果由應用程序去協助控制,形成程序邏輯上的事務,又會造成編程方面的負擔。
4.2 跨庫跨表的join問題。
在執行了分庫分表之後,難以避免會將原本邏輯關聯性很強的數據劃分到不同的表、不同的庫上,這時,表的關聯操作將受到限制,我們無法join位於不同分庫的表,也無法join分表粒度不同的表,結果原本一次查詢能夠完成的業務,可能需要多次查詢才能完成。
4.3 額外的數據管理負擔和數據運算壓力。
額
外的數據管理負擔,最顯而易見的就是數據的定位問題和數據的增刪改查的重復執行問題,這些都可以通過應用程序解決,但必然引起額外的邏輯運算,例如,對於
一個記錄用戶成績的用戶數據表userTable,業務要求查出成績最好的100位,在進行分表之前,只需一個order
by語句就可以搞定,但是在進行分表之後,將需要n個order
by語句,分別查出每一個分表的前100名用戶數據,然後再對這些數據進行合並計算,才能得出結果。
Ⅶ Mysql分表和分區的區別,分庫分表介紹與區別(
一,什麼是mysql分表,分區
什麼是分表,從表面意思上看呢,就是把一張表分成N多個小表,具體請看mysql分表的3種方法
什麼是分區,分區呢就是把一張表的數據分成N多個區塊,這些區塊可以在同一個磁碟上,也可以在不同的磁碟上,具體請參考mysql分區功能詳細介紹,以及實例
二,mysql分表和分區有什麼區別呢
1,實現方式上
a),mysql的分表是真正的分表,一張表分成很多表後,每一個小表都是完正的一張表,都對應三個文件,一個.MYD數據文件,.MYI索引文件,.frm表結構文件。
Sql代碼
[root@BlackGhosttest]#ls|grepaa
aa#P#p1.MYD
aa#P#p1.MYI
aa#P#p3.MYD
aa#P#p3.MYI
aa.frm
aa.par
Ⅷ mysql怎樣分庫
1
基本思想之什麼是分庫分表?
從字面上簡單理解,就是把原本存儲於一個庫的數據分塊存儲到多個庫上,把原本存儲於一個表的數據分塊存儲到多個表上。
2
基本思想之為什麼要分庫分表?
資料庫中的數據量不一定是可控的,在未進行分庫分表的情況下,隨著時間和業務的發展,庫中的表會越來越多,表中的數據量也會越來越大,相應地,數據操作,增刪改查的開銷也會越來越大;另外,由於無法進行分布式式部署,而一台伺服器的資源(cpu、磁碟、內存、io等)是有限的,最終資料庫所能承載的數據量、數據處理能力都將遭遇瓶頸。
3
分庫分表的實施策略。
分庫分表有垂直切分和水平切分兩種。
3.1
何謂垂直切分,即將表按照功能模塊、關系密切程度劃分出來,部署到不同的庫上。例如,我們會建立定義資料庫workdb、商品資料庫paydb、用戶資料庫userdb、日誌資料庫logdb等,分別用於存儲項目數據定義表、商品定義表、用戶數據表、日誌數據表等。
3.2
何謂水平切分,當一個表中的數據量過大時,我們可以把該表的數據按照某種規則,例如userid散列,進行劃分,然後存儲到多個結構相同的表,和不同的庫上。例如,我們的userdb中的用戶數據表中,每一個表的數據量都很大,就可以把userdb切分為結構相同的多個userdb:part0db、part1db等,再將userdb上的用戶數據表usertable,切分為很多usertable:usertable0、usertable1等,然後將這些表按照一定的規則存儲到多個userdb上。
3.3
應該使用哪一種方式來實施資料庫分庫分表,這要看資料庫中數據量的瓶頸所在,並綜合項目的業務類型進行考慮。
如果資料庫是因為表太多而造成海量數據,並且項目的各項業務邏輯劃分清晰、低耦合,那麼規則簡單明了、容易實施的垂直切分必是首選。
而如果資料庫中的表並不多,但單表的數據量很大、或數據熱度很高,這種情況之下就應該選擇水平切分,水平切分比垂直切分要復雜一些,它將原本邏輯上屬於一體的數據進行了物理分割,除了在分割時要對分割的粒度做好評估,考慮數據平均和負載平均,後期也將對項目人員及應用程序產生額外的數據管理負擔。
在現實項目中,往往是這兩種情況兼而有之,這就需要做出權衡,甚至既需要垂直切分,又需要水平切分。我們的游戲項目便綜合使用了垂直與水平切分,我們首先對資料庫進行垂直切分,然後,再針對一部分表,通常是用戶數據表,進行水平切分。
4
分庫分表存在的問題。
4.1
事務問題。
在執行分庫分表之後,由於數據存儲到了不同的庫上,資料庫事務管理出現了困難。如果依賴資料庫本身的分布式事務管理功能去執行事務,將付出高昂的性能代價;如果由應用程序去協助控制,形成程序邏輯上的事務,又會造成編程方面的負擔。
4.2
跨庫跨表的join問題。
在執行了分庫分表之後,難以避免會將原本邏輯關聯性很強的數據劃分到不同的表、不同的庫上,這時,表的關聯操作將受到限制,我們無法join位於不同分庫的表,也無法join分表粒度不同的表,結果原本一次查詢能夠完成的業務,可能需要多次查詢才能完成。
4.3
額外的數據管理負擔和數據運算壓力。
額外的數據管理負擔,最顯而易見的就是數據的定位問題和數據的增刪改查的重復執行問題,這些都可以通過應用程序解決,但必然引起額外的邏輯運算,例如,對於一個記錄用戶成績的用戶數據表usertable,業務要求查出成績最好的100位,在進行分表之前,只需一個order
by語句就可以搞定,但是在進行分表之後,將需要n個order
by語句,分別查出每一個分表的前100名用戶數據,然後再對這些數據進行合並計算,才能得出結果。
上述整理於互聯網