mysql 分表分割槽

2021-08-21 15:55:24 字數 3251 閱讀 6557

一、分表

1、垂直分割:就是將乙個表按照欄位來分,每張表保證有相同的主鍵就好。一般來說,將常用字段和大字段分表來放。

優勢:比沒有分表來說,提高了查詢速度,降低了查詢結果所用記憶體;

劣勢:沒有解決大量記錄的問題,對於單錶來說隨著記錄增多,效能還是下降很快;

2、水平分割:水平分割是企業最常用到的,水平拆分就是大表按照記錄分為很多子表:

1、hash、自增id取模:對某個字段進行hash來確定建立幾張表,並根據hash結果存入不同的表;

4、將老資料遷移到一張歷史表:比如日誌表,一般只查詢3個月之內的資料,對於超過3個月的記錄將之遷移到歷史子表中;

二、分割槽:

分割槽就是把乙個資料表的檔案和索引分散儲存在不同的物理檔案中。mysql支援的分割槽型別包括range、list、hash、key,其中range比較常用:

1、range分割槽:基於屬於乙個給定連續區間的列值,把多行分配給分割槽。

create table t_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 #maxvalue 表示最大的可能的整數值

);range分割槽在如下場合特別有用:

1)、當需要刪除乙個分割槽上的「舊的」資料時,只刪除分割槽即可。如果你使用上面最近的那個例子給出的分割槽方案,你只需簡單地使用」alter table employees drop partition p0;」

來刪除所有在2023年前就已經停止工作的雇員相對應的所有行。對於有大量行的表,這比執行乙個如」delete from employees where year (separated) <= 1990;」

這樣的乙個delete查詢要有效得多。

2)、想要使用乙個包含有日期或時間值,或包含有從一些其他級數開始增長的值的列。

3)、經常執行直接依賴於用於分割表的列的查詢。

例如,當執行乙個如」select count(*) from employees where year(separated) = 2000 group by store_id;」這樣的查詢時,

mysql可以很迅速地確定只有分割槽p2需要掃瞄,這是因為餘下的分割槽不可能包含有符合該where子句的任何記錄

2、list分割槽:類似於按range分割槽,區別在於list分割槽是基於列值匹配乙個離散值集合中的某個值來進行選擇。

create table t_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)

);list分割槽沒有類似如「values less than maxvalue」這樣的包含其他值在內的定義。將要匹配的任何值都必須在值列表中找到。

3、hash分割槽:基於使用者定義的表示式的返回值來進行選擇的分割槽,該表示式使用將要插入到表中的這些行的列值進行計算。這個函式可以包含mysql 中有效的、產生非負整數值的任何表示式。

create table user (  

id int unsigned not null auto_increment primary key,

username varchar(30) not null default '',

email varchar(30) not null default ''

) partition by hash (id) partitions 4 (

partition p0 ,

partition p1,

partition p2,

partition p3

);

4、key分割槽:類似於按hash分割槽,區別在於key分割槽只支援計算一列或多列,且mysql伺服器提供其自身的雜湊函式。必須有一列或多列包含整數值。

create table user (  

id int unsigned not null auto_increment primary key,

name varchar(30) not null default '',

email varchar(30) not null default ''

) partition by key (id) partitions 4 (

partition p0,

partition p1,

partition p2,

partition p3

);

5、分割槽的限制:1.主鍵或者唯一索引必須包含分割槽字段,如primary key (id,username),不過innodb的大組建效能不好。

2.很多時候,使用分割槽就不要在使用主鍵了,否則可能影響效能。

3.只能通過int型別的字段或者返回int型別的表示式來分割槽,通常使用year或者to_days等函式(mysql 5.6 對限制開始放開了)。

4.每個表最多1024個分割槽,而且多分割槽會大量消耗記憶體。

5.分割槽的表不支援外來鍵,相關的邏輯約束需要使用程式來實現。

6.分割槽後,可能會造成索引失效,需要驗證分割槽可行性。

mysql分表與分割槽

1 首先得確認mysql是否支援分割槽功能,這可以通過命令 show plugins 檢視如果顯示如下,則說明你的mysql版本支援partition 2 innodb一般用於具有事務和外來鍵的場合,它預設將所有的表資料和索引檔案放在乙個名為ibdata1的檔案中,屬於共享表空間。myisam預設每...

MySQL分割槽和分表

1.分割槽的型別 1 range 把連續區間按範圍劃分 例 create table user id int 11 money int 11 unsigned not null,date datetime partition by range year date partition p2014 va...

mysql分表和表分割槽詳解

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