分表和表分割槽詳解

2021-08-02 15:14:02 字數 4662 閱讀 6613

為什麼要分表和分割槽?

日常開發中我們經常會遇到大表的情況,所謂的大表是指儲存了百萬級乃至千萬級條記錄的表。這樣的表過於龐大,導致資料庫在查詢和插入的時候耗時太長,效能低下,如果涉及聯合查詢的情況,效能會更加糟糕。分表和表分割槽的目的就是減少資料庫的負擔,提高資料庫的效率,通常點來講就是提高表的增刪改查效率。

什麼是分表?

什麼是分割槽?

mysql分表和分割槽有什麼聯絡呢?分表的幾種方式:

1、mysql集群

它並不是分表,但起到了和分表相同的作用。集群可分擔資料庫的操作次數,將任務分擔到多台資料庫上。集群可以讀寫分離,減少讀寫壓力。從而提公升資料庫效能。

2、自定義規則分表

大表可以按照業務的規則來分解為多個子表。通常為以下幾種型別,也可自己定義規則。

range(範圍)–這種模式允許將資料劃分不同範圍。例如可以將乙個表通過年份劃分成若干個分割槽。

hash(雜湊)–這中模式允許通過對錶的乙個或多個列的hash key進行計算,最後通過這個hash碼不同數值對應的資料區域進行分割槽。例如可以建立乙個對錶主鍵進行分割槽的表。

key(鍵值)-上面hash模式的一種延伸,這裡的hash key是mysql系統產生的。

list(預定義列表)–這種模式允許系統通過預定義的列表的值來對資料進行分割。

composite(復合模式) –以上模式的組合使用

分表規則與分割槽規則一樣,在分割槽模組詳細介紹。

下面以range簡單介紹下如何分表(按照年份表)。

假設表結構有4個字段:自增id,姓名,存款金額,存款日期

把存款日期作為規則分表,分別建立幾個表

2023年:account_2011

2023年:account_2012

2023年:account_2015

var gettablename = function() ;

var tablename = 'account_';

var year = parseint(data.date.substring(0, 4));

if (year < 2012) else if (year < 2013) else if (year < 2014) else if (year < 2015) else

return tablename;

}

3、利用merge儲存引擎來實現分表

merge分表,分為主表和子表,主表類似於乙個殼子,邏輯上封裝了子表,實際上資料都是儲存在子表中的。

我們可以通過主表插入和查詢資料,如果清楚分表規律,也可以直接操作子表。

子表2023年

create table `account_2011` (

`id` int(11) not null auto_increment ,

`name` varchar(50) character set utf8 collate utf8_general_ci null default null ,

`money` float not null ,

`tradedate` datetime not null

primary key (`id`)

)engine=myisam

default character set=utf8 collate=utf8_general_ci

auto_increment=2

checksum=0

row_format=dynamic

delay_key_write=0

;

子表2023年

create table `account_2012` (

`id` int(11) not null auto_increment ,

`name` varchar(50) character set utf8 collate utf8_general_ci null default null ,

`money` float not null ,

`tradedate` datetime not null

primary key (`id`)

)engine=myisam

default character set=utf8 collate=utf8_general_ci

auto_increment=2

checksum=0

row_format=dynamic

delay_key_write=0

;

主表,所有年

create table `account_all` (

`id` int(11) not null auto_increment ,

`name` varchar(50) character set utf8 collate utf8_general_ci null default null ,

`money` float not null ,

`tradedate` datetime not null

primary key (`id`)

)engine=mrg_myisam

default character set=utf8 collate=utf8_general_ci

union=(`account_2011`,`account_2012`)

insert_method=last

row_format=dynamic

;

建立主表的時候有個insert_method,指明插入方式,取值可以是:0 不允許插入;first 插入到union中的第乙個表; last 插入到union中的最後乙個表。

通過主表查詢的時候,相當於將所有子表合在一起查詢。這樣並不能體現分表的優勢,建議還是查詢子表。

分割槽的幾種方式

range:

create table range( 

id int(11),

money int(11) unsigned not null,

date datetime

)partition by range(year(date))(

partition p2007 values less than (2008),

partition p2008 values less than (2009),

partition p2009 values less than (2010)

partition p2010 values less than maxvalue

);

list:

create table list( 

a int(11),

b int(11)

)(partition by list (b)

partition p0 values in (1,3,5,7,9),

partition p1 values in (2,4,6,8,0)

);

hash:

create table hash( 

a int(11),

b datetime

)partition by hash (year(b)

partitions 4;

key:

create table t_key( 

a int(11),

b datetime)

partition by key (b)

partitions 4;

分割槽管理

新增分割槽

alter table sale_data

add partition (partition p201010 values less than (201011));

刪除分割槽

--當刪除了乙個分割槽,也同時刪除了該分割槽中所有的資料。

alter table sale_data drop partition p201010;

分割槽的合併

下面的sql,將p201001 - p201009 合併為3個分割槽p2010q1 - p2010q3

alter table sale_data

reorganize partition p201001,p201002,p201003,

p201004,p201005,p201006,

p201007,p201008,p201009 into

(partition p2010q1 values less than (201004),

partition p2010q2 values less than (201007),

partition p2010q3 values less than (201010)

);

mysql分表和表分割槽詳解

為什麼要分表和分割槽?日常開發中我們經常會遇到大表的情況,所謂的大表是指儲存了百萬級乃至千萬級條記錄的表。這樣的表過於龐大,導致資料庫在查詢和插入的時候耗時太長,效能低下,如果涉及聯合查詢的情況,效能會更加糟糕。分表和表分割槽的目的就是減少資料庫的負擔,提高資料庫的效率,通常點來講就是提高表的增刪改...

mysql分表和表分割槽詳解

為什麼要分表和分割槽?日常開發中我們經常會遇到大表的情況,所謂的大表是指儲存了百萬級乃至千萬級條記錄的表。這樣的表過於龐大,導致資料庫在查詢和插入的時候耗時太長,效能低下,如果涉及聯合查詢的情況,效能會更加糟糕。分表和表分割槽的目的就是減少資料庫的負擔,提高資料庫的效率,通常點來講就是提高表的增刪改...

mysql分表和表分割槽詳解

為什麼要分表和分割槽?日常開發中我們經常會遇到大表的情況,所謂的大表是指儲存了百萬級乃至千萬級條記錄的表。這樣的表過於龐大,導致資料庫在查詢和插入的時候耗時太長,效能低下,如果涉及聯合查詢的情況,效能會更加糟糕。分表和表分割槽的目的就是減少資料庫的負擔,提高資料庫的效率,通常點來講就是提高表的增刪改...