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

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的数据目录下发现:

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';

range分区的好处:

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

sql代码:

ALTER TABLE students DROP PARTITION p0;

结果:

因此对于有大量行的表,这比运行一个如”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。

插入以下记录:

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';

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

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

现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';

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

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

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

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

[root@andy rrmj]# lsdb.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.ibdt_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.ibdt_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.ibdt_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.ibdt_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.ibdt_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.ibdt_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.ibdt_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.ibdt_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.ibdt_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.ibdt_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.ibdsql:
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个分区上的分布情况!

转载于:https://blog.51cto.com/watchman110/1689319

MYSQL分区表学习相关推荐

  1. Mysql分区表概述、分区类型、分区管理

    另有一篇简单易懂的好文章帮助学习 Mysql分区表的原理和优缺点以及注意点 一.分区概述 分区是指根据一定的规则,数据库把一个表分解成多个更小的.更容易管理的部分.分区有利于管理非常大的表. MySQ ...

  2. 最新、最全、最详细的 MySQL 数据库学习笔记总结(2021最新版)

    数据库是什么 数据库管理系统,简称为DBMS(Database Management System),是用来存储数据的管理系统. DBMS 的重要性 无法多人共享数据 无法提供操作大量数据所需的格式 ...

  3. Mysql 高级学习笔记

    Mysql 高级学习笔记 文章目录 Mysql 高级学习笔记 一.Mysql 基础 1. 聚合函数 2. having 3. sql 的执行顺序 4. 约束 5. 试图 二.Mysql 高级 1. M ...

  4. mysql分区表truncate分区数据_详解MySQL分区表

    前言: 分区是一种表的设计模式,通俗地讲表分区是将一大表,根据条件分割成若干个小表.但是对于应用程序来讲,分区的表和没有分区的表是一样的.换句话来讲,分区对于应用是透明的,只是数据库对于数据的重新整理 ...

  5. mysql分区表详解_详解MySQL分区表

    前言: 分区是一种表的设计模式,通俗地讲表分区是将一大表,根据条件分割成若干个小表.但是对于应用程序来讲,分区的表和没有分区的表是一样的.换句话来讲,分区对于应用是透明的,只是数据库对于数据的重新整理 ...

  6. linux数据库创建score表,MySQL数据库学习笔记

    MySQL数据库学习笔记phpma (实验环境:Redhat9.0,MySQL3.23.54) 纲要: 一,连接MySQL phpma 二,MySQL管理与授权 三,数据库简单操作 四, 数据库备份 ...

  7. php mysql 学习,php+mysql完全学习手册源码

    [实例简介] <php+mysql完全学习手册>(黄桂金.于永军)源码 [实例截图] [核心代码] b82c182d-8fbd-4888-854f-5dc80db47e47 └── php ...

  8. MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  9. mysql 分区表 归档_MySQL分区表

    1,MySQL分区表作用 当单表的数据量较大,需要进行定期的数据归档删除时,或者提高查询性能,都可以采用分区: 2,分区表设置 分区的种类 range分区 list分区 hash分区 key分区 ra ...

最新文章

  1. php session 在线用户,php – 使用$_SESSION超全局获取当前在线用户并将其重新设置回当前会话数据是否很难?...
  2. 爱思助手安卓能用吗_手机资讯:【爱思助手6.0】音乐铃声导入教程
  3. springboot+mybatis调用oracle存储过程
  4. Java高并发编程(八):Java并发容器和框架
  5. Android OpenGL ES 2.0绘制简单三角形
  6. ECMAScript 2021(ES12)新特性简介
  7. 索引 - 数据结构 - BTREE
  8. [蓝桥杯2019初赛]特别数的和-枚举
  9. Bulk批量操作API的介绍
  10. mount挂载光盘media_Linux挂载光盘命令
  11. 单片机can通信可以接多少个设备_总结BMS上CAN收发器电路的几个要点
  12. 头条三面: String.valueOf、toString()、(String)强转,有啥区别?
  13. AT2 Homeomorphism and the group structure on a circle
  14. math: 四元数与欧拉角(RPY角)的相互转换
  15. AdobeFlashPlayer 安装包
  16. 罗技键盘的insert键需要按住Fn才能生效?教你修改!
  17. Good Luck in CET-4 Everybody! HDU - 1847 (巴氏博弈)
  18. 体验在终端——参加2012年移动开发者大会有感
  19. 计算机卡登录界面,win10电脑卡在登录界面怎么办
  20. 把不同的pdf文档合并在一个pdf文件中,一次批量打印

热门文章

  1. 离婚时,住房公积金分割吗?
  2. linux复制后权限变化,学霸Linux基础命令吐血总结,给你当新华字典用
  3. 5首2021一些流行好听歌曲的吉他和弦
  4. 知识付费网站源码可开分站一键更新后台数据
  5. 好用的天气预报API推荐
  6. unity实现绳子效果(绳索插件Obi Rope)
  7. 山东艾思软件科技有限公司-公司介绍
  8. html页面整体缩小,浏览器缩放原理以及窗口、html页面大小
  9. 渣男劈腿,两个女生却逼他做出选择,结果......
  10. 突破KEIL软件编译时 C51中断号最大只能为31限制的补丁,使中断号可以达到256