mysql分割槽
mysql資料庫中的資料是以檔案的形勢存在磁碟上的,預設放在/mysql/data下面(可以通過my.cnf中的datadir來檢視),
一張表主要對應著三個檔案,
一個是frm存放表結構的,
一個是myd存放表資料的,
一個是myi存表索引的。
如果一張表的資料量太大的話,那麼myd,myi就會變的很大,查詢資料就會變的很慢,這個時候我們可以利用mysql的分割槽功能,
在物理上將這一張表對應的三個檔案,分割成許多個小塊,這樣呢,我們查詢一條資料時,就不用全部查找了,只要知道這條資料在哪一塊,然後在那一塊找就行了。
如果表的資料太大,可能一個磁碟放不下,這個時候,我們可以把資料分配到不同的磁盤裡面去
a,橫向分割槽
什麼是橫向分割槽呢?就是橫著來分割槽了,舉例來說明一下,假如有100W條資料,分成十份,前10W條資料放到第一個分割槽,第二個10W條資料放到第二個分割槽,依此類推。也就是把表分成了十分,根用merge來分表,有點像哦。取出一條資料的時候,這條資料包含了表結構中的所有欄位,也就是說橫向分割槽,並沒有改變表的結構。
b,縱向分割槽
什麼是縱向分割槽呢?就是豎來分割槽了,舉例來說明,在設計使用者表的時候,開始的時候沒有考慮好,而把個人的所有資訊都放到了一張表裡面去,這樣這個表裡面就會有比較大的欄位,如個人簡介,而這些簡介呢,也許不會有好多人去看,所以等到有人要看的時候,在去查詢,分表的時候,可以把這樣的大欄位,分開來。
mysql提供的分割槽屬於第一種,橫向分割槽,並且細分成很多種方式:
1.1 MySQL5.1及以上支援分割槽功能
檢視是否支援分割槽
mysql> show variables like "%part%";
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| have_partitioning | YES |
+-------------------+-------+
row in set (0.00 sec)
1.2 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;”
來刪除所有在1991年前就已經停止工作的僱員相對應的所有行。對於有大量行的表,這比執行一個如”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子句的任何記錄
1.3 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”這樣的包含其他值在內的定義。將要匹配的任何值都必須在值列表中找到。
4,hash分割槽
HASH分割槽主要用來確保資料在預先確定數目的分割槽中平均分佈,你所要做的只是基於將要被雜湊的列值指定一個列值或表示式,以 及指定被分割槽的表將要被分割成的分割槽數量。
mysql> CREATE TABLE IF NOT EXISTS `hash_part` (
-> `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '評論ID',
-> `comment` varchar(1000) NOT NULL DEFAULT '' COMMENT '評論',
-> `ip` varchar(25) NOT NULL DEFAULT '' COMMENT '來源IP',
-> PRIMARY KEY (`id`)
-> ) ENGINE=INNODB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1
-> PARTITION BY HASH(id)
-> PARTITIONS 3;
Query OK, 0 rows affected (0.06 sec)
5,key分割槽
按照KEY進行分割槽類似於按照HASH分割槽,除了HASH分割槽使用的用 戶定義的表示式,而KEY分割槽的 雜湊函式是由MySQL 伺服器提供。
mysql> CREATE TABLE IF NOT EXISTS `key_part` (
-> `news_id` int(11) NOT NULL COMMENT '新聞ID',
-> `content` varchar(1000) NOT NULL DEFAULT '' COMMENT '新聞內容',
-> `u_id` varchar(25) NOT NULL DEFAULT '' COMMENT '來源IP',
-> `create_time` DATE NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '時間'
-> ) ENGINE=INNODB DEFAULT CHARSET=utf8
-> PARTITION BY LINEAR HASH(YEAR(create_time))
-> PARTITIONS 3;
Query OK, 0 rows affected (0.07 sec)