mysql的磁區和分表
磁區
磁區就是把一個資料表的檔案和索引分散存盤在不同的物理檔案中,

mysql支持的磁區型別包括Range、List、Hash、Key,其中Range比較常用:
RANGE磁區:基于屬于一個給定連續區間的列值,把多行分配給磁區,
LIST磁區:類似于按RANGE磁區,區別在于LIST磁區是基于列值匹配一個離散值集合中的某個值來進行選擇,
HASH磁區:基于用戶定義的運算式的回傳值來進行選擇的磁區,該運算式使用將要插入到表中的這些行的列值進行計算,這個函式可以包含MySQL 中有效的、產生非負整數值的任何運算式,
KEY磁區:類似于按HASH磁區,區別在于KEY磁區只支持計算一列或多列,且MySQL服務器提供其自身的哈希函式,必須有一列或多列包含整數值,

案例:
建立一個user 表 以id進行磁區 id 小于10的在user_1磁區id小于20的在user_2磁區
create table user( id int not null auto_increment, username varchar(10), primary key(id) )engine = innodb charset=utf8 partition by range (id)( partition user_1 values less than (10), partition user_2 values less than (20) );
建立后添加磁區:
maxvalue 表示最大值 這樣大于等于20的id 都出存盤在user_3磁區
alter table user add partition(
partition user_3 values less than maxvalue
);

洗掉磁區:
alter table user drop partition user_3;
現在打開mysql的資料目錄
可以看見多了user#P#user_1.ibd 和user#P#user_2.ibd 這兩個檔案
如果表使用的存盤引擎是MyISAM型別,就是:
user#P#user_1.MYD,user#P#user_1.MYI和user#P#user_2.MYD,user#P#user_2.MYI
磁區模式詳解:
* Range(范圍) – 這種模式允許DBA將資料劃分不同范圍,例如DBA可以將一個表通過年份劃分成三個磁區,80年代(1980's)的資料,90年代(1990's)的資料以及任何在2000年(包括2000年)后的資料,
CREATE TABLE users ( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, usersname VARCHAR(30) NOT NULL DEFAULT '', email VARCHAR(30) NOT NULL DEFAULT '' ) PARTITION BY RANGE (id) ( PARTITION p0 VALUES LESS THAN (3000000), PARTITION p1 VALUES LESS THAN (6000000), PARTITION p2 VALUES LESS THAN (9000000), PARTITION p3 VALUES LESS THAN MAXVALUE );
在這里,將用戶表分成4個磁區,以每300萬條記錄為界限,每個磁區都有自己獨立的資料、索引檔案的存放目錄,

還可以將這些磁區所在的物理磁盤分開完全獨立,可以提高磁盤IO吞吐量,
如果你也想成為程式員,想要快速掌握編程,趕緊關注小編加入學習企鵝圈子吧!
里面有資深專業軟體開發工程師,在線解答你的所有疑惑~編程語言入門“so easy”
資料包含:編程入門、游戲編程、課程設計等,
免費學習書籍:

免費學習資料:
CREATE TABLE users ( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, usersname VARCHAR(30) NOT NULL DEFAULT '', email VARCHAR(30) NOT NULL DEFAULT '' ) PARTITION BY RANGE (id) ( PARTITION p0 VALUES LESS THAN (3000000) DATA DIRECTORY = '/data0/data' INDEX DIRECTORY = '/data0/index', PARTITION p1 VALUES LESS THAN (6000000) DATA DIRECTORY = '/data1/data' INDEX DIRECTORY = '/data1/index', PARTITION p2 VALUES LESS THAN (9000000) DATA DIRECTORY = '/data2/data' INDEX DIRECTORY = '/data2/index', PARTITION p3 VALUES LESS THAN MAXVALUE DATA DIRECTORY = '/data3/data' INDEX DIRECTORY = '/data3/index' ); * List(預定義串列) – 這種模式允許系統通過DBA定義的串列的值所對應的行資料進行分割,例如:DBA根據用戶的型別進行磁區, CREATE TABLE user ( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30) NOT NULL DEFAULT '' , user_type int not null ) PARTITION BY LIST (user_type ) ( PARTITION p0 VALUES IN (0,4,8,12) , PARTITION p1 VALUES IN (1,5,9,13) , PARTITION p2 VALUES IN (2,6,10,14), PARTITION p3 VALUES IN (3,7,11,15) );
分成4個區,同樣可以將磁區設定的獨立的磁盤中,
* Key(鍵值) 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 ); * Hash(哈希) 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 );
分表
分表和磁區類似,區別是,磁區是把一個邏輯表檔案分成幾個物理檔案后進行存盤,而分表則是把原先的一個表分成幾個表,進行分表查詢時可以通過union或者視圖,
分表又分垂直分割和水平分割,其中水平分分割最為常用,水平分割通常是指切分到另外一個資料庫或表中,例如對于一個會員表,按對3的模進行分割:
table = id%3
如果id%3 = 0 則將用戶資料放入到user_0表中,如id%3=1就放入user_1表中,依次類推,
在這里有個問題,這個uid應該是所有會員按序增長的,可他是怎么得到的呢?使用auto_increment是不行的,這樣就用到序列了,
對于一些流量統計系統,其資料量比較大,并且對過往資料的關注度不高,這時按年、月、日進行分表,將每日統計資訊放到一個以日期命名的表中;或者按照增量進行分表,如每個表100萬資料,超過100萬就放入第二個表,還可以按Hash進行分表,但是按日期和取模余數分表最為常見,也容易擴展,
分表后可能會遇到新的問題,那就是查詢,分頁和統計,通用的方法是在程式中進行處理,輔助視圖,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/240436.html
標籤:MySQL
