資料庫的切分和優化

2021-09-20 09:21:13 字數 2146 閱讀 9960

資料庫的切分和優化

1.引言

隨著網際網路應用的普及,海量資料的儲存和訪問成為了系統設計的瓶頸問題。對於乙個大型的網際網路應用,每天幾十億pv無疑對資料庫造成了相當高的負載。對於系統的穩定性和擴充套件性造成了極大的問題。

(1)水平切分資料庫:可以降低單台機器的負載,同時最大限度的降低了宕機造成的損失;

(2)通過負載均衡策略:有效的降低了單台機器的訪問負載,降低了宕機的可能性;

(3)通過集群方案:解決了資料庫宕機帶來的單點資料庫不能訪問的問題;

(4)通過讀寫分離策略:最大限度提高了應用張讀取資料的速度和併發量

2.基本原理與概念

(1)什麼是資料切分

如果在單一資料庫上處理應用資料捉襟見肘而需要進行分割槽化之類的處理,是如何辦到的呢?答案就是:sharding。

sharding不是某個特定資料庫附屬的功能,而是在具體實現技術的抽象,是水平擴充套件的解決方案,主要目的是為了實現單點伺服器的i/o能力限制,解決資料庫擴充套件性問題。也就是: 通過一系列的切分規則將資料水平分布到不同的db或table中,再通過相應的db路由或者table路由規則找到需要查詢的具體的db或者table,進行query操作。

[sql]view plaincopy

article_id(int),tile(varchar(128)),contnet(varchar(1024)),user_id(int)

這樣一張表我們怎樣切分呢?怎樣將這樣的資料分不到不同的資料庫中的表中呢?其實分析blog應用,我們可以得出如下結論:可以使用user_id欄位作為我們分庫的規則基礎

將user_id為1-10000的所有文章放入db1的article表中,將user_id為10001-20000的所有文章放入db2的article表中,以此類推,一直到dbn。

這樣一來,文章資料就被分到了各個資料庫中,達到了資料切分的目的。接下來要解決的就是怎麼找到具體的資料庫呢?解決方法也很明顯:既然分庫的時候我們使用了分割槽欄位user_id,那麼資料庫路由的時候當然少不了user_id。我們知道了user_id,利用分庫時的規則,反過來定位具體資料庫,比如user_id=234,利用剛才的規則,就會定位到db1,降入user_id是12343,利用該規則,就會定位到db2.以此類推,利用分庫的規則,反向路由到具體的db,這個過程我們稱為db路由。

(2)如何資料切分

1)分庫

也就是物理上的資料切分。將資料通過一系列的切分規則將資料分布到不同的db伺服器上,通過路由規則訪問特定的資料庫。這樣一來,每次訪問的就不是單台伺服器了,而是n臺,這樣就可以降低單台機器的負載壓力。

分庫方式:

1>按號段分

如用user_id來區分,1-1000的對應db1,1001-2000的對應db2,以此類推。

優點:可部分遷移

缺點:資料分布不均

2>hash取模分

對user_id進行hsah(如果user_id是數字的話,直接用user_id也行),然後用乙個特定的數字,比如需要將乙個資料庫切分成4個資料庫的話,我們就用4對user_id進行取模,也就是user_id%4,這樣的話就有4種結果:1的時候對應db1,2的時候對應db2,3的時候對應db3,0的時候對應db4,這樣一來資料就會非常均勻的將資料分配到4個db中。

優點:資料分布均勻

缺點:不能按照近期效能分攤資料

2)分表

也就是資料庫內的資料切分。對資料通過一系列的切分規則,將資料分不到乙個資料庫的不同表中,如將article表分為article_001,article_002等子表,若干個表水平拼接會在邏輯上組成乙個完整的article表。

這麼做作用是十分明顯的。舉個例子:比如article表中有5000w條資料,此時我們在表中insert一條新的資料,insert完成之後,資料庫會針對這張表重新建立索引,而5000w條資料建立索引的系統開銷是不容忽視的。但是如果我們把錶分為100個子表呢?從article_001一直到article_100,5000w資料平均下來,每個子表中就只有50w條資料,這時候我們向一張只有50w條資料的表中insert之後建立索引的時間就會成數量級的下降,極大的提高了db執行時的效率,提高了db的併發量。

綜上:分庫降低了單點機器的負載;分表提高了了資料操作的效率,尤其是寫操作的效率

資料庫的垂直切分和水平切分

分類 資料庫技術 2013 04 08 22 39 664人閱讀收藏 舉報資料切分可以是物理上的,對資料通過一系列的切分規則將資料分布到不同的db伺服器上,通過路由規則路由訪問特定的資料庫,這樣一來每次訪問面對的就不是單台伺服器了,而是n臺伺服器,這樣就可以降低單台機器的負載壓力。數據切分也可以是資...

資料庫的垂直切分和水平切分

資料切分可以是物理上的,對資料通過一系列的切分規則將資料分布到不同的db伺服器上,通過路由規則路由訪問特定的資料庫,這樣一來每次訪問面對的就不是單台伺服器了,而是n臺伺服器,這樣就可以降低單台機器的負載壓力。數據切分也可以是資料庫內的,對資料通過一系列的切分規則,將資料分布到乙個資料庫的不同表中,比...

資料庫切分

千萬量級的資料,用 mysql 要怎麼存?初學者在看到這個問題的時候,可能首先想到的是 mysql 一張表到底能存放多少條資料?根據 mysql 官方文件的介紹,mysql 理論上限是 232 2 條資料,然而實際操作中,往往還受限於下面兩條因素 myisam data pointer size,m...