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
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);
因此我们通过查询information_schema.PARTITIONS表来验证。
select table_name ,partition_name ,table_rows from information_schema.partitions where table_schema=database() and table_name='workers';
现drop partition命令只能用在RANGE和LIST分区中。
alter table workers partition by hash(id) partitions 6;
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 |+-------------+----------------+------------+
转载于:https://blog.51cto.com/watchman110/1689319
MYSQL分区表学习相关推荐
- Mysql分区表概述、分区类型、分区管理
另有一篇简单易懂的好文章帮助学习 Mysql分区表的原理和优缺点以及注意点 一.分区概述 分区是指根据一定的规则,数据库把一个表分解成多个更小的.更容易管理的部分.分区有利于管理非常大的表. MySQ ...
- 最新、最全、最详细的 MySQL 数据库学习笔记总结(2021最新版)
数据库是什么 数据库管理系统,简称为DBMS(Database Management System),是用来存储数据的管理系统. DBMS 的重要性 无法多人共享数据 无法提供操作大量数据所需的格式 ...
- Mysql 高级学习笔记
Mysql 高级学习笔记 文章目录 Mysql 高级学习笔记 一.Mysql 基础 1. 聚合函数 2. having 3. sql 的执行顺序 4. 约束 5. 试图 二.Mysql 高级 1. M ...
- mysql分区表truncate分区数据_详解MySQL分区表
前言: 分区是一种表的设计模式,通俗地讲表分区是将一大表,根据条件分割成若干个小表.但是对于应用程序来讲,分区的表和没有分区的表是一样的.换句话来讲,分区对于应用是透明的,只是数据库对于数据的重新整理 ...
- mysql分区表详解_详解MySQL分区表
前言: 分区是一种表的设计模式,通俗地讲表分区是将一大表,根据条件分割成若干个小表.但是对于应用程序来讲,分区的表和没有分区的表是一样的.换句话来讲,分区对于应用是透明的,只是数据库对于数据的重新整理 ...
- linux数据库创建score表,MySQL数据库学习笔记
MySQL数据库学习笔记phpma (实验环境:Redhat9.0,MySQL3.23.54) 纲要: 一,连接MySQL phpma 二,MySQL管理与授权 三,数据库简单操作 四, 数据库备份 ...
- php mysql 学习,php+mysql完全学习手册源码
[实例简介] <php+mysql完全学习手册>(黄桂金.于永军)源码 [实例截图] [核心代码] b82c182d-8fbd-4888-854f-5dc80db47e47 └── php ...
- MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- mysql 分区表 归档_MySQL分区表
1,MySQL分区表作用 当单表的数据量较大,需要进行定期的数据归档删除时,或者提高查询性能,都可以采用分区: 2,分区表设置 分区的种类 range分区 list分区 hash分区 key分区 ra ...
最新文章
- php session 在线用户,php – 使用$_SESSION超全局获取当前在线用户并将其重新设置回当前会话数据是否很难?...
- 爱思助手安卓能用吗_手机资讯:【爱思助手6.0】音乐铃声导入教程
- springboot+mybatis调用oracle存储过程
- Java高并发编程(八):Java并发容器和框架
- Android OpenGL ES 2.0绘制简单三角形
- ECMAScript 2021(ES12)新特性简介
- 索引 - 数据结构 - BTREE
- [蓝桥杯2019初赛]特别数的和-枚举
- Bulk批量操作API的介绍
- mount挂载光盘media_Linux挂载光盘命令
- 单片机can通信可以接多少个设备_总结BMS上CAN收发器电路的几个要点
- 头条三面: String.valueOf、toString()、(String)强转,有啥区别?
- AT2 Homeomorphism and the group structure on a circle
- math: 四元数与欧拉角(RPY角)的相互转换
- AdobeFlashPlayer 安装包
- 罗技键盘的insert键需要按住Fn才能生效?教你修改!
- Good Luck in CET-4 Everybody! HDU - 1847 (巴氏博弈)
- 体验在终端——参加2012年移动开发者大会有感
- 计算机卡登录界面,win10电脑卡在登录界面怎么办
- 把不同的pdf文档合并在一个pdf文件中,一次批量打印
热门文章
- 离婚时,住房公积金分割吗?
- linux复制后权限变化,学霸Linux基础命令吐血总结,给你当新华字典用
- 5首2021一些流行好听歌曲的吉他和弦
- 知识付费网站源码可开分站一键更新后台数据
- 好用的天气预报API推荐
- unity实现绳子效果(绳索插件Obi Rope)
- 山东艾思软件科技有限公司-公司介绍
- html页面整体缩小,浏览器缩放原理以及窗口、html页面大小
- 渣男劈腿,两个女生却逼他做出选择,结果......
- 突破KEIL软件编译时 C51中断号最大只能为31限制的补丁,使中断号可以达到256