MySQL表分區技術詳細介紹

一、概述

數據庫單表到達必定量後,性能會有衰減,像mysql\sql server等猶爲明顯,因此須要把這些數據進行分區處理。同時有時候可能出現數據剝離什麼的,分區表就更有用處了!html

MySQL 5.1 中新增的分區(Partition)功能就開始增長,優點也愈來愈明顯了:mysql

  • 與單個磁盤或文件系統分區相比,能夠存儲更多的數據
  • 很容易就能刪除不用或者過期的數據
  • 一些查詢能夠獲得極大的優化
  • 涉及到 SUM()/COUNT() 等聚合函數時,能夠並行進行
  • IO吞吐量更大
  • 分區容許能夠設置爲任意大小的規則,跨文件系統分配單個表的多個部分。實際上,表的不一樣部分在不一樣的位置被存儲爲單獨的表。

二、分區技術支持

在5.6以前,使用這個參數查看當將配置是否支持分區:sql

mysql> SHOW VARIABLES LIKE '%partition%';
+-----------------------+-------+
|Variable_name          | Value |
+-----------------------+-------+
| have_partition_engine | YES   |
+-----------------------+-------+

若是是yes表示你當前的配置支持分區。 在5.6及以採用後,則採用以下方式進行查看:數據庫

mysql> SHOW PLUGINS;
+----------------------------+----------+--------------------+---------+---------+
| Name                       | Status   | Type               | Library | License |
+----------------------------+----------+--------------------+---------+---------+
| binlog                     | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| mysql_native_password      | ACTIVE   | AUTHENTICATION     | NULL    | GPL     |
..................................................................................
| INNODB_LOCKS               | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_LOCK_WAITS          | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| partition                  | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
+----------------------------+----------+--------------------+---------+---------+

42 rows in set (0.00 sec) 最後一行,能夠看到partition是ACTIVE的,表示支持分區。服務器

三、分區類型及舉例

3.1 範圍分區

RANGE 分區:基於屬於一個給定連續區間的列值,把多行分配給分區。如時間,連續的常量值等 --按年分區less

mysql> use mytest;
Database changed
mysql> create table range_p( 
    -> perid int(11), 
    -> pername char(12) not null, 
    -> monsalary DECIMAL(10,2),
    -> credate datetime 
    -> ) partition by range(year(credate))( 
    -> partition p2011 values less than (2011), 
    -> partition p2012 values less than (2012), 
    -> partition p2013 values less than (2013), 
    -> partition p2014 values less than (2014),
    -> partition p2015 values less than maxvalue 
    -> );
Query OK, 0 rows affected (0.12 sec)

3.2 列舉分區

LIST 分區:相似於按RANGE分區,區別在於LIST分區是基於列值匹配一個離散值集合中的某個值來進行選擇。好比說相似性別(1,2)等屬性值。函數

mysql> create table list_p( 
    -> perid int(11), 
    -> pername char(12) not null,
    -> sex int(1) not null,
    -> monsalary DECIMAL(10,2),
    -> credate datetime 
    -> ) partition by list(sex) (
    -> partition psex1 values in(1),
    -> partition psex2 values in(2));
Query OK, 0 rows affected (0.06 sec)

注意,list只能是數字,使用字符會報錯ERROR 1697 (HY000): VALUES value for partition 'psex1' must have type INT。性能

3.3 離散分區

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

--以int字段hash分區code

create table hash_p( 
perid int(11), 
pername char(12) not null,
sex int(1) not null,
monsalary DECIMAL(10,2),
credate datetime 
) partition by hash (perid) 
partitions 8;

--以時間函數hash分區

mysql> create table hash_p( 
    -> perid int(11), 
    -> pername char(12) not null,
    -> sex int(1) not null,
    -> monsalary DECIMAL(10,2),
    -> credate datetime 
    -> ) partition by hash (year(credate)) 
    -> partitions 8;
Query OK, 0 rows affected (0.11 sec)

3.4 鍵值分區

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

mysql> create table key_p( 
    -> perid int(11), 
    -> pername char(12) not null,
    -> sex int(1) not null,
    -> monsalary DECIMAL(10,2),
    -> credate datetime 
    -> ) partition by key (perid) 
    -> partitions 8;
Query OK, 0 rows affected (0.12 sec)

3.5 其它說明

mysql-5.5開始支持COLUMNS分區,可視爲RANGE和LIST分區的進化,COLUMNS分區能夠直接使用非整形數據進行分區。COLUMNS分區支持如下數據類型: 全部整形,如INT SMALLINT TINYINT BIGINT。FLOAT和DECIMAL則不支持。 日期類型,如DATE和DATETIME。其他日期類型不支持。 字符串類型,如CHAR、VARCHAR、BINARY和VARBINARY。BLOB和TEXT類型不支持。 COLUMNS可使用多個列進行分區。

mysql> create table range_p( 
    -> perid int(11), 
    -> pername char(12) not null, 
    -> monsalary DECIMAL(10,2),
    -> credate datetime 
    -> ) PARTITION BY RANGE COLUMNS (credate)( 
    -> partition p20151 values less than ('2015-04-01'), 
    -> partition p20152 values less than ('2015-07-01'), 
    -> partition p20153 values less than ('2015-10-01'), 
    -> partition p20154 values less than ('2016-01-01'),
    -> partition p20161 values less than ('2016-04-01'),
    -> partition partlog values less than maxvalue 
    -> );
Query OK, 0 rows affected (0.12 sec)

官方資料:https://dev.mysql.com/doc/refman/5.5/en/partitioning.html

相關文章
相關標籤/搜索