MySQL分庫分表與水平分割取模案例

2022-03-23 05:42:09 字數 4191 閱讀 7182

分表分庫

當專案比較大的時候,基本上都會進行分表分庫的

後面就講講什麼時候需要分庫,什麼時候需要分表

垂直拆分就是要把表按模組劃分到不同資料庫表中(當然原則還是不破壞第三正規化),這種拆分在大型**的演變過程中是很常見的。當乙個**還在很小的時候,只有小量的人來開發和維護,各模組和表都在一起,當**不斷豐富和壯大的時候,也會變成多個子系統來支撐,這時就有按模組和功能把錶劃分出來的需求。其實,相對於垂直切分更進一步的是服務化改造,說得簡單就是要把原來強耦合的系統拆分成多個弱耦合的服務,通過服務間的呼叫來滿足業務需求看,因此表拆出來後要通過服務的形式暴露出去,而不是直接呼叫不同模組的表,**在架構不斷演變過程,最重要的一環就是服務化改造,把使用者、交易、店鋪、寶貝這些核心的概念抽取成獨立的服務,也非常有利於進行區域性的優化和治理,保障核心模組的穩定性

垂直拆分用於分布式場景。

當大團隊在做電商專案的時候,基本上都會將乙個專案進行拆分,拆分成n個小專案

這樣做的好處就是,基於逆向服務架構,會拆分多個小專案,每個小專案都有自己單獨的資料庫,這樣的話小專案之間互不影響。

這樣叫做垂直分割。

比如:會員資料庫、訂單資料庫、支付資料庫等等這樣來分

可以減低開發團隊之間的耦合度。就比如,某個團隊把乙個資料庫弄掛了,對另外的團隊基本沒有影響。假如全部用的乙個資料庫,是不是全部都掛了,所有用到那個資料庫的團隊專案進度都要延期

上面談到垂直切分只是把錶按模組劃分到不同資料庫,但沒有解決單錶大資料量的問題,而水平切分就是要把乙個表按照某種規則把資料劃分到不同表或資料庫裡。例如像計費系統,通過按時間來劃分表就比較合適,因為系統都是處理某一時間段的資料。而像saas應用,通過按使用者維度來劃分資料比較合適,因為使用者與使用者之間的隔離的,一般不存在處理多個使用者資料的情況,簡單的按user_id範圍來水平切分

為什麼需要分表,就比如,乙個表,幾十年的資料全部在那個表中,查詢,無論你加索引還是怎麼,查詢都需要很長的時間。

這個時候就需要做乙個分表、分表的規則,一般按照業務需求來定。沒有統一的分法。

比如:我們的業務場景,主要是存放日誌的,日誌是需要按照每年存放的

這個時候分表的話,就根據年份來分

如果是根據位數,最大的缺點是分部不均勻!

另外如會員系統,通過手機號登入。會員表中

可以通過手機號前三位分表(有一些專案是這樣做的,沒多大問題),比如136 138 155等,但是都不是怎麼均勻

最好通過水平分割(取模演算法)來分割

假如我們需要把乙個表分成3個表,我們可以把乙個是數字的字段,比如int主鍵(userid)。

這個時候,我們可以對錶中資料的userid欄位對3進行取模,然後對於不同的餘數進行分表

這裡的取模字段不能用自動增長的

實現取模演算法,我們需要有專門的一張表存放對應的userid欄位(用來取模的字段)。

在插入行時,先生成id,然後在該表中取出對應的userid,然後賦值過去

是否需要分表,這個依據專案經驗和實際業務情況來的。一般mysql單錶1000w左右的資料是沒有問題的(前提是應用系統和資料庫等層面設計和優化的比較好)

當然,如果需要分表,肯定是需要提前計畫半年或者一年計劃的。

通俗理解垂直分割和水平分割:水平拆分行,行資料拆分到不同表中, 垂直拆分列,表資料拆分到不同表中

使用取模演算法分表的最大好處就是,可以非常均勻的分配

首先建立三張表 user0 / user1 /user2 , 然後我再建立 uuid表,該錶的作用就是提供自增的id。

建立資料庫: split_horizon

create

table

user0(

id int unsigned primary

key,

name

varchar(32) not

null

default'',

pwd

varchar(32) not

null

default

'')engine

=myisam charset utf8;

create

table

user1(

id int unsigned primary

key,

name

varchar(32) not

null

default'',

pwd

varchar(32) not

null

default

'')engine

=myisam charset utf8;

create

table

user2(

id int unsigned primary

key,

name

varchar(32) not

null

default'',

pwd

varchar(32) not

null

default

'')engine

=myisam charset utf8;

create

table

uuid(

id int unsigned primary

keyauto_increment

)engine

=myisam charset utf8;

功能就是 註冊分表,以及進行分表查詢

專案很簡單,看下了解下分表是怎麼回事就好,

package

com.uifuture.service;

import

org.springframework.beans.factory.annotation.autowired;

import

org.springframework.jdbc.core.jdbctemplate;

import

org.springframework.stereotype.service;

/*** created with intellij idea.

* user: 陳浩翔.

* date: 2018/2/5.

* time: 下午 10:28.

* explain: */

@service

public

class

userservice

/*** 通過userid查詢name

* @param

userid

* @return

*/public

string get(long userid)

}

package

com.uifuture.controller;

import

com.uifuture.service.userservice;

import

org.springframework.beans.factory.annotation.autowired;

import

import

org.springframework.web.bind.annotation.restcontroller;

/*** created with intellij idea.

* user: 陳浩翔.

* date: 2018/2/5.

* time: 下午 10:44.

* explain: */

@restcontroller

public

class

usercontroller

/*** 演示獲取name

* @param

id *

@return

*/

public

string get(long id)

}

分表之後也有些缺點。

1.分頁查詢

2.查詢非常受限制

比如我不查詢那個分表的關鍵字段

所以一般會有主表和次表

主表存放所有的資料。次表根據具體業務需求進行分表

還有mycar中介軟體具有分表功能,可以學學

取模演算法的缺點,如果我們的表發生改變,需要我們重新分,很麻煩

(哈哈,可以使用阿里雲的rds雲資料庫,這樣就不用我們關心讀寫分離,分表分庫等等。rds是二次開發的資料庫,所以在效能上來說,比其他的關係型資料庫是快很多的。可以自己去了解下)

Sharding JDBC 實現水平分庫分表

1 需求分析 cid bigint 20 not null,cname varchar 50 null,user id bigint 20 null,cstatus varchar 10 null,primary key cid create table edu db 1 course 2 cid ...

什麼是垂直分庫分表,水平分庫分表

垂直分片 按照業務拆分的方式稱為垂直分片,又稱為縱向拆分,它的核心理念是專庫專用。在拆分之前,乙個資料庫由多個資料表構成,每個表對應著不同的業務。而拆分之後,則是按照業務將表進行歸類,分布到不同的資料庫中,從而將壓力分散至不同的資料庫。下圖展示了根據業務需要,將使用者表和訂單表垂直分片到不同的資料庫...

mysql 水平分表 垂直分表

mysql的分表技術 水平分割技術 以qq使用者登入為例 建立uuid表 create table uuid id int unsigned primary key auto increment 建立3張使用者表 create table qqlogin0 id int unsigned prima...