运维利器之mysql进行表的分区
特别声明一下哈,小编不是DBA,所以相对来说对mysql的理解不是那么的透彻,小编可以做到的是确保数据的安全,知道数据怎么存储,才能更好的保护数据,知己知彼,方能百战不殆,哈,最近想到了数据库分区这块,所以也就自己鼓捣鼓捣看看
什么叫做表的分区,这个吧,小编有个外号,他们都叫小编粗人一个,在这里就不多解释了,简单的理解一下就是把一个大表根据相应的条件给分割成好多的小表,来增加数据库的性能,虽然说的有瑕疵,但是可以这样理解
基本分区类型
RANGE分区
这个是非常简单理解的,就是说把需要分区的字段具体的点来进行分区,比如说年龄,将小于10岁的分一个区,小于20岁的分一个区,小于30岁的分一个区,其他年龄的分一个区。这里需要注意得是分区的名字是不区分大小写的,也就是说p01==P01,这两个是一个表的分区
###创建表的时候进行分区
mysql> create table t1 (id int,name varchar(20),age int)
-> partition by range(age)
-> (
-> partition p01 values less than (10),
-> partition p02 values less than (20),
-> partition p03 values less than (30),
-> partition p04 values less than (maxvalue)
-> );
Query OK, 0 rows affected (0.07 sec)
###检验分区后的效果
[root@lnmp mysql]# ll test2
总用量 404
-rw-rw---- 1 mysql mysql 61 11月 14 16:20 db.opt
-rw-rw---- 1 mysql mysql 8614 11月 14 16:23 t1.frm
-rw-rw---- 1 mysql mysql 36 11月 14 16:23 t1.par
-rw-rw---- 1 mysql mysql 98304 11月 14 16:23 t1#P#p01.ibd ###分区后的效果
-rw-rw---- 1 mysql mysql 98304 11月 14 16:23 t1#P#p02.ibd ###分区后的效果
-rw-rw---- 1 mysql mysql 98304 11月 14 16:23 t1#P#p03.ibd ###分区后的效果
-rw-rw---- 1 mysql mysql 98304 11月 14 16:23 t1#P#p04.ibd ###分区后的效果
LIST分区
这个的话,个人感觉哈,就是把上面的range分区进行了列表话分区,range分区不是一个分区时一个条件吗,但是这个list分区里面可以是多个条件来分成一个区。列如:将物品id为1,2,3分为一个分区,物品id为4,5,6分为一个分区,物品id为7,8,9另一个分区。对,就是这样。
mysql> create table t2 (id int,cid int,name varchar(20),pos_date datetime)
-> partition by list(cid)
-> (
-> partition p01 values in (1,2,3),
-> partition p02 values in (4,5,6),
-> partition p03 values in (7,8,9)
-> );
Query OK, 0 rows affected (0.01 sec)
[root@lnmp test2]# ll t2*
-rw-rw---- 1 mysql mysql 8652 11月 14 19:40 t2.frm
-rw-rw---- 1 mysql mysql 32 11月 14 19:40 t2.par
-rw-rw---- 1 mysql mysql 98304 11月 14 19:40 t2#P#p01.ibd ###分区后的效果
-rw-rw---- 1 mysql mysql 98304 11月 14 19:40 t2#P#p02.ibd ###分区后的效果
-rw-rw---- 1 mysql mysql 98304 11月 14 19:40 t2#P#p03.ibd ###分区后的效果
HASH分区
这个分区的优点在于数据分布的比较均匀,还有一系列的较为复杂的算法,可以这样理解,就比如大于2的分布一个区,小于2的分一个区,当然了,小编的思考还是比较简单了,其实她也是相当的复杂,具体的话可以看看官方的文档喽。
mysql> create table t3 (id int,cid int,name varchar(20),pos_date datetime)
-> partition by hash (cid)
-> partitions 4; ###指定分区数量
Query OK, 0 rows affected (0.01 sec)
[root@lnmp test2]# ll t3*
-rw-rw---- 1 mysql mysql 8652 11月 14 19:54 t3.frm
-rw-rw---- 1 mysql mysql 32 11月 14 19:54 t3.par
-rw-rw---- 1 mysql mysql 98304 11月 14 19:54 t3#P#p0.ibd ###分区后的效果
-rw-rw---- 1 mysql mysql 98304 11月 14 19:54 t3#P#p1.ibd ###分区后的效果
-rw-rw---- 1 mysql mysql 98304 11月 14 19:54 t3#P#p2.ibd ###分区后的效果
-rw-rw---- 1 mysql mysql 98304 11月 14 19:54 t3#P#p3.ibd ###分区后的效果
LINEAR HASH分区
hash分区的一种,优点在于适合处理极其大量数据的表,是一个线性哈希分区,但是也有缺点,导致数据分布不是那么的均匀。导致某一个节点数据较多,查询次数较多。
mysql> create table t4 (id int,cid int,name varchar(20),pos_date datetime) partition by linear hash(cid) partitions 4;
Query OK, 0 rows affected (1.73 sec)
[root@lnmp test2]# ll t4*
-rw-rw---- 1 mysql mysql 8652 11月 14 20:07 t4.frm
-rw-rw---- 1 mysql mysql 32 11月 14 20:07 t4.par
-rw-rw---- 1 mysql mysql 98304 11月 14 20:07 t4#P#p0.ibd
-rw-rw---- 1 mysql mysql 98304 11月 14 20:07 t4#P#p1.ibd
-rw-rw---- 1 mysql mysql 98304 11月 14 20:07 t4#P#p2.ibd
-rw-rw---- 1 mysql mysql 98304 11月 14 20:07 t4#P#p3.ibd
KEY分区
类似于hash分区,hash分区使用的用户自定义的表达式,但是kkey分区的哈希函数是有mysql服务器提供。mysql簇(cluster)使用md5()来实现key分区;对于使用其他存储引擎的表,服务器使用的其自己的内部的哈希函数,这些函数是基于与PASSWORD()一样的运算法则。使用率不是很高,做一了解即可
mysql> create table t5 (id int,cid int,name varchar(20),pos_date datetime) partition by linear key (cid) partitions 4;
Query OK, 0 rows affected (1.64 sec)
[root@lnmp test2]# ll t5*
-rw-rw---- 1 mysql mysql 8652 11月 14 20:18 t5.frm
-rw-rw---- 1 mysql mysql 32 11月 14 20:18 t5.par
-rw-rw---- 1 mysql mysql 98304 11月 14 20:18 t5#P#p0.ibd
-rw-rw---- 1 mysql mysql 98304 11月 14 20:18 t5#P#p1.ibd
-rw-rw---- 1 mysql mysql 98304 11月 14 20:18 t5#P#p2.ibd
-rw-rw---- 1 mysql mysql 98304 11月 14 20:18 t5#P#p3.ibd
多列分区
以前我们在分区的时候,只是用的一个字段来进行的分区,有时候,我们也需要两个或者多个字段来进行分区,于是在mysql5.5后加入COLUMNS关键字允许多个字段来进行分区
mysql> create table t6 (a int,b int,c int)
-> partition by range columns(a,b)
-> (
-> partition p01 values less than (10,10),
-> partition p02 values less than (10,20),
-> partition p03 values less than (10,30),
-> partition p04 values less than (10,maxvalue),
-> partition p05 values less than (maxvalue,maxvalue)
-> );
[root@lnmp test2]# ll t6*
-rw-rw---- 1 mysql mysql 8602 11月 14 20:42 t6.frm
-rw-rw---- 1 mysql mysql 44 11月 14 20:42 t6.par
-rw-rw---- 1 mysql mysql 98304 11月 14 20:42 t6#P#p01.ibd
-rw-rw---- 1 mysql mysql 98304 11月 14 20:42 t6#P#p02.ibd
-rw-rw---- 1 mysql mysql 98304 11月 14 20:42 t6#P#p03.ibd
-rw-rw---- 1 mysql mysql 98304 11月 14 20:42 t6#P#p04.ibd
-rw-rw---- 1 mysql mysql 98304 11月 14 20:42 t6#P#p05.ibd
结束语
针对不同的场景要合理的使用不同的分区,小编的责任就是保证数据的安全,知己知彼方能百战不殆,少年们,一起来加油呀.
|