MYSQL分区表学习

MYSQL表分区学习

注:学习这个知识点是为后面线上数据库中用户表分区做些储备知识,当前那张表有2KW多的记录。

1,什么是表分区?

       首先要知道mysql在5.1开始支持表分区,在说什么是表分区之前要知道什么是表空间?表空间有独立表空间和共享表空间之分, 开启了Innodb的innodb_file_per_table这个参数之后也就是启用InnoDB的独立表空间模式。简单来说共享表空间就是把所有表的数据都放在同一个.idb的文件中,独立表空间就是每个innodb的表都拥有自己专属的.idb文件,说的够清楚吧!现在来说什么是表分区,通俗来说就是按照一定的规则将一个大表的.idb文件分成若干个.idb文件。

需要注意的是:分区是逻辑层面进行了水平分割,对于应用程序来说,它仍是一张表。

分区就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上

 

mysql root@localhost:(none)> SELECT version();
+-------------+
| version()   |
|-------------|
| 5.6.22      |
+-------------+
mysql root@localhost:(none)> show VARIABLES like 'innodb_file_per_table' ;
+-----------------------+---------+
| Variable_name         | Value   |
|-----------------------+---------|
| innodb_file_per_table | ON      |
+-----------------------+---------+
mysql root@localhost:(none)> show plugins

wKioL1XgJarSbaudAAEpStEIARs199.jpg 

2为什么要进行分区?

       面对当今大数据存储,设想当mysql中一个表的总记录超过千万,会出现性能的大幅度下降吗?答案是肯定的,一个表的总记录超过千万,在操作系统层面检索也是效率非常低的。就是说当表的数据量过大时,数据库检索性能会降低!

 

3,分区有什么好处?

       分区就是为了尽量避免随着表中记录的增加,数据库检索性能减低的情况,目的就是为了提高数据库的性能!

 

4,分区有哪些类型?

        RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区。

        LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。

        HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。

        KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多  列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。

   

以下是针对各种分区类型的简单示例:

range分区(基于属于一个给定连续区间的列值,把多行分配给分区。这些区间要连续且不能相互重叠,使用VALUES LESS THAN操作符来进行定义。以下是实例。)

sql代码:

create table students (
       id int not null,
       name varchar(30),
       age int not null
)
partition by range (id)(
       partition p0 values less than (10), 
       partition p1 values less than (100),
       partition p2 values less than (1000),
       partition p3 values less than maxvalue
);

可以在mysql的数据目录下发现:

wKioL1Xf-0yhIOKwAADyItzujIA941.jpg

 

 p0,p1,p1,p2就是我们定义的4个分区,id <10的记录将会保存在p0分区,<100的保存在p1分区,<1000的保存在p2分区,>=1000的将会保存在p3分区,这里的maxvalue值得就是可能出现的最大值(id)。

insert into students values(1,'student1',16);
insert into students values(11,'student11',16);
insert into students values(111,'student111',16);
insert into students values(1111,'student1111',16);

sql代码,验证插入的记录在分区上的分布!

 select 
    table_name ,partition_name ,table_rows 
from 
    information_schema.partitions 
where 
    table_schema=database() and table_name='students';

wKiom1Xf_BOCBaPQAABkJjVGxcE464.jpg

range分区的好处:

1,当需要删除一个分区上的“旧的”数据时,只删除分区即可。比如我想删除id<10的记录:

sql代码:

ALTER TABLE students DROP PARTITION p0;

结果:

wKioL1XgAuPhAMvFAACYzfha6j4062.jpg

因此对于有大量行的表,这比运行一个如”DELETE FROM students WHERE id <= XXX;”这样的一个DELETE查询要有效得多。

 2,想要使用一个包含有日期或时间值,或包含有从一些其他级数开始增长的值的列。

3,经常运行直接依赖于用于分割表的列的查询。例如,当执行一个如”SELECT COUNT(*) FROM students WHERE  id<1000 GROUP BY id;”这样的查询时,MySQL可以很迅速地确定只有分区p3需要扫描,这是因为余下的分区不可能包含有符合该WHERE子句的任何记录。

 

list分区(类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。)

注:list分区用的比较少,这次学习就先暂时跳过,后面需要时再学习!

 

HASH分区(基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。)

sql代码:

create table workers (
       id int not null,
       name varchar(30),   
       age int not null
)
       partition by hash(id)
       partitions 4;

可以在mysql的数据目录下发现:由于我们是分成4个hash区,因此可以看到四个表空间文件,分别是workers#p#pi.ibd,i=0,1,2,3。

wKioL1XgDbDyqSaSAADuXQWARGQ740.jpg

插入以下记录:

insert into workers values(0,'worker0',30);
insert into workers values(1,'worker1',30);
insert into workers values(2,'worker2',30);
insert into workers values(3,'worker3',30);
insert into workers values(4,'worker4',30);
insert into workers values(5,'worker5',30);
insert into workers values(6,'worker6',30);
insert into workers values(7,'worker7',30);
insert into workers values(8,'worker8',30);
insert into workers values(9,'worker9',30);
insert into workers values(10,'worker10',30);
insert into workers values(11,'worker11',30);
insert into workers values(12,'worker12',30);
insert into workers values(13,'worker13',30);
insert into workers values(14,'worker14',30);
insert into workers values(15,'worker15',30);
insert into workers values(16,'worker16',30);
insert into workers values(17,'worker17',30);
insert into workers values(18,'worker18',30);
insert into workers values(19,'worker19',30);

 

这里的hash分区的确定按照如下规则:

     mod(0,4) = 0,在分区p0;

     mod(1,4) = 1,在分区p1;

     mod(2,4) = 2,在分区p2

     mod(3,4) = 3,在分区p3;

     mod(4,4) = 0,在分区p0;

     mod(5,4) = 1,在分区p1;

     ......后面类似

因此我们通过查询information_schema.PARTITIONS表来验证。

sql代码:

 select 

    table_name ,partition_name ,table_rows 

from 

    information_schema.partitions 

where 

    table_schema=database() and table_name='workers';

执行结果如下:符合期望!

wKiom1XgDqbzqP3aAABoZ-jDydM213.jpg

 注:hash的计算本质是mod运算,必须是整数。

 wKiom1XgFBvwDhNMAAB0p9fv2rc904.jpg

 现drop partition命令只能用在RANGE和LIST分区中。

  可以通过下面的命令,进行重新分区:

alter table workers partition by hash(id) partitions 6;

sql代码:

 select 

    table_name ,partition_name ,table_rows 

from 

    information_schema.partitions 

where 

    table_schema=database() and table_name='workers';

wKiom1XgFbyDAjghAABs2xTD3HA435.jpg

 发现数据在分区上进行了调整,并且没有丢失数据!

 

KEY分区(类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。)

注:key分区稍微复杂,这次学习就先暂时跳过,后面需要时再学习!  

 

下面是我把我们线上环境的一张2kw的大表进行hash分区的记录:

[root@andy rrmj]# ls

db.opt                 t_my_series#P#p17.ibd  t_my_series#P#p27.ibd  t_my_series#P#p37.ibd  t_my_series#P#p47.ibd  t_my_series#P#p57.ibd  t_my_series#P#p67.ibd  t_my_series#P#p77.ibd  t_my_series#P#p87.ibd  t_my_series#P#p97.ibd

t_my_series.frm        t_my_series#P#p18.ibd  t_my_series#P#p28.ibd  t_my_series#P#p38.ibd  t_my_series#P#p48.ibd  t_my_series#P#p58.ibd  t_my_series#P#p68.ibd  t_my_series#P#p78.ibd  t_my_series#P#p88.ibd  t_my_series#P#p98.ibd

t_my_series.par        t_my_series#P#p19.ibd  t_my_series#P#p29.ibd  t_my_series#P#p39.ibd  t_my_series#P#p49.ibd  t_my_series#P#p59.ibd  t_my_series#P#p69.ibd  t_my_series#P#p79.ibd  t_my_series#P#p89.ibd  t_my_series#P#p99.ibd

t_my_series#P#p0.ibd   t_my_series#P#p1.ibd   t_my_series#P#p2.ibd   t_my_series#P#p3.ibd   t_my_series#P#p4.ibd   t_my_series#P#p5.ibd   t_my_series#P#p6.ibd   t_my_series#P#p7.ibd   t_my_series#P#p8.ibd   t_my_series#P#p9.ibd

t_my_series#P#p10.ibd  t_my_series#P#p20.ibd  t_my_series#P#p30.ibd  t_my_series#P#p40.ibd  t_my_series#P#p50.ibd  t_my_series#P#p60.ibd  t_my_series#P#p70.ibd  t_my_series#P#p80.ibd  t_my_series#P#p90.ibd

t_my_series#P#p11.ibd  t_my_series#P#p21.ibd  t_my_series#P#p31.ibd  t_my_series#P#p41.ibd  t_my_series#P#p51.ibd  t_my_series#P#p61.ibd  t_my_series#P#p71.ibd  t_my_series#P#p81.ibd  t_my_series#P#p91.ibd

t_my_series#P#p12.ibd  t_my_series#P#p22.ibd  t_my_series#P#p32.ibd  t_my_series#P#p42.ibd  t_my_series#P#p52.ibd  t_my_series#P#p62.ibd  t_my_series#P#p72.ibd  t_my_series#P#p82.ibd  t_my_series#P#p92.ibd

t_my_series#P#p13.ibd  t_my_series#P#p23.ibd  t_my_series#P#p33.ibd  t_my_series#P#p43.ibd  t_my_series#P#p53.ibd  t_my_series#P#p63.ibd  t_my_series#P#p73.ibd  t_my_series#P#p83.ibd  t_my_series#P#p93.ibd

t_my_series#P#p14.ibd  t_my_series#P#p24.ibd  t_my_series#P#p34.ibd  t_my_series#P#p44.ibd  t_my_series#P#p54.ibd  t_my_series#P#p64.ibd  t_my_series#P#p74.ibd  t_my_series#P#p84.ibd  t_my_series#P#p94.ibd

t_my_series#P#p15.ibd  t_my_series#P#p25.ibd  t_my_series#P#p35.ibd  t_my_series#P#p45.ibd  t_my_series#P#p55.ibd  t_my_series#P#p65.ibd  t_my_series#P#p75.ibd  t_my_series#P#p85.ibd  t_my_series#P#p95.ibd

t_my_series#P#p16.ibd  t_my_series#P#p26.ibd  t_my_series#P#p36.ibd  t_my_series#P#p46.ibd  t_my_series#P#p56.ibd  t_my_series#P#p66.ibd  t_my_series#P#p76.ibd  t_my_series#P#p86.ibd  t_my_series#P#p96.ibd

sql:
mysql> select table_name ,partition_name ,table_rows  from information_schema.partitions  where table_schema=database() and table_name='t_my_series';

+-------------+----------------+------------+

| table_name  | partition_name | table_rows |

+-------------+----------------+------------+

| t_my_series | p0             |     194181 |

| t_my_series | p1             |     195304 |

| t_my_series | p2             |     195561 |

| t_my_series | p3             |     195840 |

| t_my_series | p4             |     195846 |

| t_my_series | p5             |     194445 |

| t_my_series | p6             |     196426 |

| t_my_series | p7             |     196451 |

| t_my_series | p8             |     196977 |

| t_my_series | p9             |     196975 |

| t_my_series | p10            |     194458 |

| t_my_series | p11            |     197833 |

| t_my_series | p12            |     198110 |

| t_my_series | p13            |     195024 |

| t_my_series | p14            |     195307 |

| t_my_series | p15            |     194732 |

| t_my_series | p16            |     197543 |

| t_my_series | p17            |     198973 |

| t_my_series | p18            |     199816 |

| t_my_series | p19            |     200422 |

| t_my_series | p20            |     200435 |

| t_my_series | p21            |     200725 |

| t_my_series | p22            |     201361 |

| t_my_series | p23            |     201512 |

| t_my_series | p24            |     201809 |

| t_my_series | p25            |     202377 |

| t_my_series | p26            |     202075 |

| t_my_series | p27            |     202926 |

| t_my_series | p28            |     202640 |

| t_my_series | p29            |     203215 |

| t_my_series | p30            |     203496 |

| t_my_series | p31            |     203486 |

| t_my_series | p32            |     203782 |

| t_my_series | p33            |     204371 |

| t_my_series | p34            |     204619 |

| t_my_series | p35            |     204618 |

| t_my_series | p36            |     204928 |

| t_my_series | p37            |     205467 |

| t_my_series | p38            |     205763 |

| t_my_series | p39            |     206055 |

| t_my_series | p40            |     206332 |

| t_my_series | p41            |     206307 |

| t_my_series | p42            |     206622 |

| t_my_series | p43            |     206897 |

| t_my_series | p44            |     207187 |

| t_my_series | p45            |     207451 |

| t_my_series | p46            |     208014 |

| t_my_series | p47            |     208315 |

| t_my_series | p48            |     208584 |

| t_my_series | p49            |     209175 |

| t_my_series | p50            |     209158 |

| t_my_series | p51            |     209434 |

| t_my_series | p52            |     198400 |

| t_my_series | p53            |     199586 |

| t_my_series | p54            |     209758 |

| t_my_series | p55            |     210566 |

| t_my_series | p56            |     210297 |

| t_my_series | p57            |     210850 |

| t_my_series | p58            |     210851 |

| t_my_series | p59            |     211148 |

| t_my_series | p60            |     211130 |

| t_my_series | p61            |     211416 |

| t_my_series | p62            |     211695 |

| t_my_series | p63            |     211706 |

| t_my_series | p64            |     211973 |

| t_my_series | p65            |     211987 |

| t_my_series | p66            |     212269 |

| t_my_series | p67            |     205186 |

| t_my_series | p68            |     212832 |

| t_my_series | p69            |     212827 |

| t_my_series | p70            |     212543 |

| t_my_series | p71            |     213120 |

| t_my_series | p72            |     213119 |

| t_my_series | p73            |     213382 |

| t_my_series | p74            |     213382 |

| t_my_series | p75            |     213382 |

| t_my_series | p76            |     213382 |

| t_my_series | p77            |     213382 |

| t_my_series | p78            |     213382 |

| t_my_series | p79            |     213382 |

| t_my_series | p80            |     213382 |

| t_my_series | p81            |     213382 |

| t_my_series | p82            |     213382 |

| t_my_series | p83            |     213382 |

| t_my_series | p84            |     208028 |

| t_my_series | p85            |     213382 |

| t_my_series | p86            |     213382 |

| t_my_series | p87            |     213382 |

| t_my_series | p88            |     213382 |

| t_my_series | p89            |     213382 |

| t_my_series | p90            |     192443 |

| t_my_series | p91            |     192472 |

| t_my_series | p92            |     192733 |

| t_my_series | p93            |     193009 |

| t_my_series | p94            |     193040 |

| t_my_series | p95            |     193588 |

| t_my_series | p96            |     193600 |

| t_my_series | p97            |     193598 |

| t_my_series | p98            |     193886 |

| t_my_series | p99            |     194169 |

+-------------+----------------+------------+

 

 上面说明了这么多数据在100个分区上的分布情况!

 

 

 

 

 

 

 

 

你可能感兴趣的:(hash,表分区,表空间,分区表,range)