MySQL資料表range分割槽例子,按年/按月
檢視分割槽資料量,檢視全庫資料量
USE information_schema;
SELECT PARTITION_NAME,TABLE_ROWS
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_NAME = 'sale_data';
WHERE TABLE_SCHEMA = 'db_name'
ORDER BY table_rows DESC;
http://www.cnblogs.com/chenmh/p/5627912.html
http://www.cnblogs.com/LO-gin/p/6125394.html
某些行業資料量的增長速度極快,隨著資料庫中資料量的急速膨脹,資料庫的插入和查詢效率越來越低。此時,除了程式程式碼和查詢語句外,還得在資料庫的結構上做點更改;在一個主讀輔寫的資料庫中,當資料表資料超過1000w行後,那查詢效率真的很讓人抓狂。就算早前建了索引,也很難滿足使用者對於系統查詢效率的體驗。
優化方案是分表或分割槽。至於分割槽的原理以及分割槽和分表的區別,搜尋一下,都介紹的很詳細,這裡就不作冗餘介紹。簡單來講,分表旨在提高資料庫的併發能力,分割槽旨在優化磁碟的IO和資料的讀寫,所以採用什麼方案,還得根據業務再作斟酌。由於我們的系統對併發要求不高,所以便採用了分割槽。
分割槽是MySQL5.1以後實現的。其中分割槽型別有RANGE分割槽、LIST分割槽、HASH分割槽、KEY分割槽。我們這裡是使用RANGE分割槽來講解。
分割槽需要注意的一點是:要麼不定義主鍵,要麼把分割槽欄位新增到主鍵中。並且分割槽欄位不能為NULL,要不然就難以確定分割槽範圍。所以要設為NOT NULL。
首先執行一下show plugins; 檢視partition這一欄是否為ACTIVE,是則表示資料庫支援分割槽。
1、建立一個數據表並分割槽:
CREATE TABLE ` table_name` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`uid` VARCHAR(50) DEFAULT NULL,
`action` VARCHAR(10) DEFAULT NULL,
` channel` VARCHAR(20) DEFAULT NULL,
`count_left` INT(11) DEFAULT NULL,
`end_time` INT(11) DEFAULT '0',
PRIMARY KEY (`id`,`end_time`),
KEY `time` (`end_time`)
) ENGINE=MYISAM DEFAULT CHARSET=utf8
PARTITION BY RANGE(`end_time`) (
PARTITION p161130 VALUES LESS THAN (1480550399),
PARTITION p161231 VALUES LESS THAN (1483228799),
PARTITION p170131 VALUES LESS THAN (1485907199),
PARTITION p170228 VALUES LESS THAN (1488326399),
PARTITION p170331 VALUES LESS THAN (1491004799),
PARTITION p170430 VALUES LESS THAN (1493596799),
PARTITION p170531 VALUES LESS THAN (1496275199),
PARTITION p170631 VALUES LESS THAN (1498867199),
PARTITION pnow VALUES LESS THAN MAXVALUE
);
2、修改一個數據表分割槽:
ALTER TABLE `table_name`
PARTITION BY RANGE(`end_time`) (
PARTITION p161130 VALUES LESS THAN (1480550399),
PARTITION p161231 VALUES LESS THAN (1483228799),
PARTITION p170131 VALUES LESS THAN (1485907199),
PARTITION p170228 VALUES LESS THAN (1488326399),
PARTITION p170331 VALUES LESS THAN (1491004799),
PARTITION p170430 VALUES LESS THAN (1493596799),
PARTITION p170531 VALUES LESS THAN (1496275199),
PARTITION p170631 VALUES LESS THAN (1498867199),
PARTITION pnow VALUES LESS THAN MAXVALUE
);
說明:1、2中使用end_time (時間是以時間戳的形式記錄的) 作為分割槽欄位對錶進行分割槽。分割槽的區分值為分割槽名中的時間的時間戳形式,比如2016/11/30 23:59:59 轉為秒數為1480550399。以上的程式碼中,我將資料表分為9個區,從16年11月30日到17年06月31日 共8個區加上pnow這個區存放17年6月31日以後的資料;如上所示,16年11月30日以前的資料,將會存放在p161130這個分割槽中16年12月01日至16年12月31日的資料將會存放在p161231分割槽中,以此類推…
分割槽後可以執行以下語句檢視效果(後面也可以用該語句檢視每個分割槽中有多少資料):
SELECT PARTITION_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 'table_name';
3、刪除一個分割槽:
執行語句:ALTER TABLE table_name DROP PARTITION p_name;
注意:刪除一個分割槽時,該分割槽內的所有資料也都會被刪除;
如果用這樣來刪除資料,要比用delete from table_name where …要有效得多;
4、新增一個分割槽:
執行語句:ALTER TABLE table_name ADD PARTITION (PARTITION p_name VALUES LESS THAN (xxxxxxxxx));
注意:如果原先最後一個分割槽是PARTITION pnow VALUES LESS THAN MAXVALUE; 那麼應該先刪除該分割槽,然後在執行新增分割槽語句,然後再新增回該分割槽;
按年分割槽
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
);
按月分割槽
http://www.cnblogs.com/gengwudaxia/p/5961367.html