您好,登錄后才能下訂單哦!
1、概述
數(shù)據(jù)庫(kù)單表到達(dá)一定量后,性能會(huì)有衰減,像mysql\sql server等猶為明顯,所以需要把這些數(shù)據(jù)進(jìn)行分區(qū)處理。同時(shí)有時(shí)候可能出現(xiàn)數(shù)據(jù)剝離什么的,分區(qū)表就更有用處了!
MySQL 5.1 中新增的分區(qū)(Partition)功能就開(kāi)始增加,優(yōu)勢(shì)也越來(lái)越明顯了:
--與單個(gè)磁盤或文件系統(tǒng)分區(qū)相比,可以存儲(chǔ)更多的數(shù)據(jù)
--很容易就能刪除不用或者過(guò)時(shí)的數(shù)據(jù)
--一些查詢可以得到極大的優(yōu)化
--涉及到 SUM()/COUNT() 等聚合函數(shù)時(shí),可以并行進(jìn)行
--IO吞吐量更大
--分區(qū)允許可以設(shè)置為任意大小的規(guī)則,跨文件系統(tǒng)分配單個(gè)表的多個(gè)部分。實(shí)際上,表的不同部分在不同的位置被存儲(chǔ)為單獨(dú)的表。
2、分區(qū)技術(shù)支持
在5.6之前,使用這個(gè)參數(shù)查看當(dāng)將配置是否支持分區(qū)
mysql> SHOW VARIABLES LIKE '%partition%';
+-----------------------+-------+
|Variable_name | Value |
+-----------------------+-------+
| have_partition_engine | YES |
+-----------------------+-------+
如果是yes表示你當(dāng)前的配置支持分區(qū)
在5.6及以采用后,則采用如下方式進(jìn)行查看
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的,表示支持分區(qū)
3、分區(qū)類型及舉例
3.1范圍分區(qū)
RANGE 分區(qū):基于屬于一個(gè)給定連續(xù)區(qū)間的列值,把多行分配給分區(qū)。如時(shí)間,連續(xù)的常量值等
--按年分區(qū)
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列舉分區(qū)
LIST 分區(qū):類似于按RANGE分區(qū),區(qū)別在于LIST分區(qū)是基于列值匹配一個(gè)離散值集合中的某個(gè)值來(lái)進(jìn)行選擇。比如說(shuō)類似性別(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只能是數(shù)字,使用字符會(huì)報(bào)錯(cuò)ERROR 1697 (HY000): VALUES value for partition 'psex1' must have type INT
3.3離散分區(qū)
HASH分區(qū):基于用戶定義的表達(dá)式的返回值來(lái)進(jìn)行選擇的分區(qū),該表達(dá)式使用將要插入到表中的這些行的列值進(jìn)行計(jì)算。這個(gè)函數(shù)可以包>含MySQL中有效的、產(chǎn)生非負(fù)整數(shù)值的任何表達(dá)式。
--以int字段hash分區(qū)
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;
--以時(shí)間函數(shù)hash分區(qū)
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鍵值分區(qū)
KEY分區(qū):類似于按HASH分區(qū),區(qū)別在于KEY分區(qū)只支持計(jì)算一列或多列,且MySQL服務(wù)器提供其自身的哈希函數(shù)。必須有一列或多列包含>整數(shù)值。
其分區(qū)方法與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其它說(shuō)明
mysql-5.5開(kāi)始支持COLUMNS分區(qū),可視為RANGE和LIST分區(qū)的進(jìn)化,COLUMNS分區(qū)可以直接使用非整形數(shù)據(jù)進(jìn)行分區(qū)。COLUMNS分區(qū)支持以下數(shù)據(jù)類型:
所有整形,如INT SMALLINT TINYINT BIGINT。FLOAT和DECIMAL則不支持。
日期類型,如DATE和DATETIME。其余日期類型不支持。
字符串類型,如CHAR、VARCHAR、BINARY和VARBINARY。BLOB和TEXT類型不支持。
COLUMNS可以使用多個(gè)列進(jìn)行分區(qū)。
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)
4、綜述
總體說(shuō)來(lái),mysql的分區(qū)還在進(jìn)步,需要進(jìn)一步的加強(qiáng),與oracle相比,還有差距!比如說(shuō)基于非數(shù)據(jù)類型的分區(qū)技術(shù),目前還沒(méi)有!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。