分庫分表的情況和作用

2021-07-10 22:05:28 字數 1431 閱讀 9476

一,先說一下為什麼要分表

當一張的資料達到幾百萬時,你查詢一次所花的時間會變多,如果有聯合查詢的話,我想有可能會死在那兒了。分表的目的就在於此,減小資料庫的負擔,縮短查詢時間。

根據個人經驗,mysql執行乙個sql的過程如下:

1,接收到sql;2,把sql放到排隊佇列中 ;3,執行sql;4,返回執行結果。在這個執行過程中最花時間在什麼地方呢?第一,是排隊等待的時間,第二,sql的執行時間。其實這二個是一回事,等待的同時,肯定有sql在執行。所以我們要縮短sql的執行時間。

mysql中有一種機制是表鎖定和行鎖定,為什麼要出現這種機制,是為了保證資料的完整性,我舉個例子來說吧,如果有二個sql都要修改同一張表的同一條資料,這個時候怎麼辦呢,是不是二個sql都可以同時修改這條資料呢?很顯然mysql對這種情況的處理是,一種是表鎖定(myisam儲存引擎),乙個是行鎖定(innodb儲存引擎)。表鎖定表示你們都不能對這張表進行操作,必須等我對錶操作完才行。行鎖定也一樣,別的sql必須等我對這條資料操作完了,才能對這條資料進行操作。如果資料太多,一次執行的時間太長,等待的時間就越長,這也是我們為什麼要分表的原因。

二,分表

1,做mysql集群,例如:利用mysql cluster ,mysql proxy,mysql replication,drdb等等

有人會問mysql集群,根分表有什麼關係嗎?雖然它不是實際意義上的分表,但是它啟到了分表的作用,做集群的意義是什麼呢?為乙個資料庫減輕負擔,說白了就是減少sql排隊佇列中的sql的數量,舉個例子:有10個sql請求,如果放在乙個資料庫伺服器的排隊佇列中,他要等很長時間,如果把這10個sql請求,分配到5個資料庫伺服器的排隊佇列中,乙個資料庫伺服器的佇列中只有2個,這樣等待時間是不是大大的縮短了呢?這已經很明顯了。所以我把它列到了分表的範圍以內,我做過一些mysql的集群:

linux mysql proxy 的安裝,配置,以及讀寫分離

mysql replication 互為主從的安裝及配置,以及資料同步

優點:擴充套件性好,沒有多個分表後的複雜操作(php**)

缺點:單個表的資料量還是沒有變,一次操作所花的時間還是那麼多,硬體開銷大。

2,預先估計會出現大資料量並且訪問頻繁的表,將其分為若干個表

這種預估大差不差的,論壇裡面發表帖子的表,時間長了這張表肯定很大,幾十萬,幾百萬都有可能。 聊天室裡面資訊表,幾十個人在一起一聊乙個晚上,時間長了,這張表的資料肯定很大。像這樣的情況很多。所以這種能預估出來的大資料量表,我們就事先分出個n個表,這個n是多少,根據實際情況而定。以聊天資訊表為例:

我事先建100個這樣的表,message_00,message_01,message_02……….message_98,message_99.然後根據使用者的id來判斷這個使用者的聊天資訊放到哪張表裡面,你可以用hash的方式來獲得,可以用求餘的方式來獲得,方法很多,各人想各人的吧。下面用hash的方法來獲得表名:

檢視複製列印?

Mycat和分庫分表

mycat是一種非常流行的分布式資料庫中間外掛程式,mycat的作用為滿足資料庫的大量儲存,提高了查詢效能,從架構的角度來理解就是前端使用者可以把mycat看作是乙個資料庫的 核心功能是分庫分表,即將乙個大表水平分割為n個小表。mycat的原理是攔截了使用者傳送過來的sql語句,首先對sql語句做一...

分庫分表和sharding jdbc

關係型資料庫在大於一定資料量的情況下效能會急劇下降。在面對網際網路海量資料的情況時,所有資料都存於一張表,顯然很容易會達到資料表可承受的資料量閾值。單純分表雖然可以解決資料量過大導致檢索變慢的問題,但無法解決高併發情況下訪問同乙個庫,導致資料庫響應變慢的問題。所以通常水平拆分都至少要採用分庫的方式,...

分庫分表是什麼,什麼情況下需要用分庫分表

顧名思義,即把存於乙個庫的資料分散到多個庫中,把存於乙個表的資料分散到多個表中。當乙個資料庫被建立之後,隨著時間的推移和業務量的增加,資料庫中表以及表中的資料量就會越來越多,就有可能出現兩種弊端 1 資料庫的儲存資源是有限的,其負載能力也是有限的,資料的大量積累肯定會導致其處理資料的能力下降 2 資...