mysql的分區概念
在mysql 5.1.3之後引入和partition(分區)的概念。這個是個好東東。以前遇到一個大表的時候,我們會手動將其分為幾個小表(就是分表操作)。但是分表操作有幾個缺點:1 麻煩,這裡指的麻煩是不僅對於調用分表的sql語句的處理上,也是分表的具體操作步驟上。2 當一個表從單表變為分表的時候,上層sql邏輯也需要進行修改,而且是大範圍的修改!
引入分區的概念就簡單多了。強調一點,一個表分區了,它還是一個表!一個表分表了,它就不是一個表了!這實際上是個會讓你不得不使用分區的理由,當你對一個表分區的時候,上層的代碼邏輯是不用變的。
分區就是一個表分割在不同的磁片檔中。
你可以使用mysql> SHOW VARIABLES LIKE '%partition%'; 確定mysql是否支援partition
分區類型
分區的關鍵字就是partition,它分為Range, List, Hash, Key這幾種分割方法
Range partition: 按照某個欄位的範圍進行分區。這種常用在時間欄位上。
比如使用場景是論壇的文章表,論壇的文章最經常進行的查詢也不過就是在最近幾個月的論壇文章中進行操作。所以這樣的文章內容使用時間進行分區是最好不過的了。
CREATE TABLE article (
article_id int NOT Null AUTO_INCREMENT,
article_content Varchar(1000),
article_time DATE NOT Null DEFAULT '1970-01-01',
key(article_id)
)
ENGINE=INNODB
PARTITION BY RANGE (YEAR(article_time)) (
PARTITION p0 VALUES LESS THAN (1991),
PARTITION p1 VALUES LESS THAN (1996),
PARTITION p2 VALUES LESS THAN (2001),
PARTITION p3 VALUES LESS THAN MAXVALUE
) ;
上面的語句就是按照年份將文章分為4個分區
List partition:按照某個欄位有哪些值分在一個分區內
直接拿官網的一個sql語句做例子
CREATE TABLE employees (
id INT NOT Null,
fname VARCHAR(30),
lname VARCHAR(30),
hired DATE NOT Null DEFAULT '1970-01-01',
separated DATE NOT Null DEFAULT '9999-12-31',
job_code INT,
store_id INT
)
PARTITION BY LIST(store_id) (
PARTITION pNorth VALUES IN (3,5,6,9,17),
PARTITION pEast VALUES IN (1,2,10,11,19,20),
PARTITION pWest VALUES IN (4,12,13,14,18),
PARTITION pCentral VALUES IN (7,8,15,16)
);
Hash partition: 按照表中任意個int類型的欄位進行分割
CREATE TABLE part_table (
id int NOT Null AUTO_INCREMENT,
name Varchar(30),
store_id int,
key(id)
)
ENGINE=INNODB
PARTITION BY HASH(store_id)
PARTITIONS 4;
Key partition: Hash partition的進階版,將主鍵作為分割的標準
比如
CREATE TABLE part_table2 (
id int NOT Null AUTO_INCREMENT PRIMARY KEY,
name Varchar(30),
store_id int
)
ENGINE=INNODB
PARTITION BY KEY()
PARTITIONS 4;
恰當的分區當然比單表是好多的,不僅利於管理,也利於提高查詢效率。分區由於代價非常小,所以在一般的使用上應該先考慮使用它。但是它也不是萬能鑰匙,分區說到底還是在一個mysql上進行的操作,如果資料量達到一定程度,還是會需要分庫分表來進行操作的。
參考文檔
HTTP://fanqiang.chinaunix.net/db/mysql/2006-05-08/4135.shtml
通過分區(Partition)提升MySQL性能
HTTP://dev.mysql.com/doc/refman/5.1/en/partitioning.html
官方文檔
HTTP://blog.51yip.com/mysql/1029.html
mysql分表,分區的區別和聯繫
HTTP://hi.baidu.com/thinkinginlamp/item/91f6edda33e45cdf251f40e3
全站熱搜
留言列表