1. 程式人生 > >mysql 分區說明

mysql 分區說明

有效 整數 是否 結構 如果 small number count() 保存

當 MySQL的總記錄數超過了100萬後,性能會大幅下降,可以采用分區方案

分區允許根據指定的規則,跨文件系統分配單個表的多個部分。表的不同部分在不同的位置被存儲為單獨的表。

1.先看下innodb的數據結構

(1)共享表空間的數據結構

技術分享

1 create table t3(id int)engine innodb;

查看保存的文件t3.frm,ibdata1的文件,存放著所有的表額數據和索引

(2)獨立表空間的數據結構

技術分享

1 create table t2(id int)engine innodb;

查看保存的文件  

技術分享

要對innodb進行分區操作,需要要設置innodb的表空間為獨立表空間

如果以前不是獨立表空間,在設置了innodb_file_per_table=1重啟mysql後,使用alter table table_name engine=innodb;修改為獨立表空間

2.分區的優勢:

  (1)與單個磁盤或文件系統分區相比,可以存儲更多的數據
  (2)很容易就能刪除不用或者過時的數據
  (3)一些查詢可以得到極大的優化
  (4)涉及到 SUM()/COUNT() 等聚合函數時,可以並行進行
  (5)IO吞吐量更大

分區的限制

  • 最大分區數目不能超過1024
  • 如果含有唯一索引或者主鍵,則分區列必須包含在所有的唯一索引或者主鍵在內
  • 不支持外鍵
  • 不支持全文索引(fulltext)

3.查看mysql是否支持分區

1 SHOW VARIABLES LIKE ‘%partition%‘

  技術分享

或者用

1 SHOW PLUGINS;

技術分享 

4.分區類型

  (1)RANGE 分區:基於屬於一個給定連續區間的列值,把多行分配給分區。

  (2)LIST 分區:類似於按RANGE分區,區別在於LIST分區是基於列值匹配一個離散值集合中的某個值來進行選擇。

  (3)HASH分區:基於用戶定義的表達式的返回值來進行選擇的分區,該表達式使用將要插入到表中的這些行的列值進行計算。這個函數可以包>含MySQL中有效的、產生非負整數值的任何表達式。

    hash分區的目的是將數據均勻的分布到預先定義的各個分區中,保證各分區的數據量大致一致。

hash的分區函數頁需要返回一個整數值。partitions子句中的值是一個非負整數,不加的partitions子句的話,默認為分區數為1。

  (4)KEY分區:類似於按HASH分區,區別在於KEY分區只支持計算一列或多列,且MySQL服務器提供其自身的哈希函數。必須有一列或多列包含>整數值。

  (5)columns分區

  mysql-5.5開始支持COLUMNS分區,COLUMNS分區可以直接使用非整形數據進行分區。COLUMNS分區支持以下數據類型:
    所有整形,如INT SMALLINT TINYINT BIGINT。FLOAT和DECIMAL則不支持。
    日期類型,如DATE和DATETIME。其余日期類型不支持。
    字符串類型,如CHAR、VARCHAR、BINARY和VARBINARY。BLOB和TEXT類型不支持。
  COLUMNS可以使用多個列進行分區。

eg:

1 2 3 4 5 create table t( id int )engine innodb partition by hash(id) partitions 4;

查看一個該表的文件結構

技術分享

t表實現的分區,分成了4個分區

註:

  HASH分區不能刪除分區,所以不能使用DROP PARTITION操作進行分區刪除操作

  ALTER TABLE ... COALESCE PARTITION num來合並分區,num是減去的分區數量;

  ALTER TABLE ... ADD PARTITION PARTITIONS num來增加分區,num是在原先基礎上再增加的分區數量

  減去兩個分區後,數據根據現有的分區進行了重新的分布

1 ALTER TABLE t ADD PARTITION PARTITIONS 3;

技術分享

1 ALTER TABLE t COALESCE PARTITION 3;

 技術分享

 

  

  

mysql 分區說明