MySQL資料表range分區例子

來源:互聯網
上載者:User

標籤:charset   更改   value   表分區   create   har   cti   partition   查看   

某些行業資料量的增長速度極快,隨著資料庫中資料量的急速膨脹,資料庫的插入和查詢效率越來越低。此時,除了程式碼和查詢語句外,還得在資料庫的結構上做點更改;在一個主讀輔寫的資料庫中,當資料表資料超過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; 那麼應該先刪除該分區,然後在執行新增分區語句,然後再新增回該分區;

 

MySQL資料表range分區例子

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.