mysql的partition分区
前言:当一个表里面存储的数据特别多的时候,比如单个.myd数据都已经达到10G了的话,必然导致读取的效率很低,这个时候我们可以采用把数据分到几张表里面来解决问题。
方式一:通过业务逻辑根据数据的大小通过id%10这种来分成 user1,user2,user3等这样的,但是这样会有很多问题我们需要维护这样一个hash关系,
而且每次读取数据和写入数据的时候还要去判断取那张表,这个是我们通过程序去识别写表和读表的。
方式二:mysql可以通过partition进行分区,这种分区显示给我们的数据依然都是在一个数据表里面的,不影响我们读取查询数据,
而是mysql内部的文件机制实现了将数据存储在不同的数据文件里,这样的好处是mysql自动将对应的数据分到的不同的.myd文件里面去
了大大降低了文件的大小,将数据分摊了,很好的提高了效率。
今天分析的是方式二利用mysql的partition进行分区
该列子数据库名:test
mysql安装路径:/data/local/mysql/
mysql的partition分区又分为两种:按照范围分区(range),按照散列分区(list)
一:按照范围实现分区
mysql> create table topic(
-> tid int(4) primary key auto_increment,
-> title char(20) not null default '')
-> engine=myisam default charset=utf8
-> partition by range(tid)(
-> partition test0 values less than(10),
-> partition test1 values less than(20),
-> partition test2 values less than(maxvalue));
Query OK, 0 rows affected (0.05 sec)
进入test数据库的文件目录查看生成的文件
ls -all /data/local/mysql/data/test/
特别需要注意文件类型为.MYD的这里存储的是数据
-rw-rw---- 1 mysql mysql 8590 May 10 01:27 topic.frm
-rw-rw---- 1 mysql mysql 40 May 10 01:27 topic.par
-rw-rw---- 1 mysql mysql 0 May 10 20:13 topic#P#test0.MYD
-rw-rw---- 1 mysql mysql 1024 May 10 20:13 topic#P#test0.MYI
-rw-rw---- 1 mysql mysql 0 May 10 20:13 topic#P#test1.MYD
-rw-rw---- 1 mysql mysql 1024 May 10 20:13 topic#P#test1.MYI
-rw-rw---- 1 mysql mysql 0 May 10 20:13 topic#P#test2.MYD
-rw-rw---- 1 mysql mysql 1024 May 10 20:13 topic#P#test2.MYI
我们加入一些数据看看效果
mysql> insert into topic(`title`) values('a');
Query OK, 1 row affected (0.00 sec)
-rw-rw---- 1 mysql mysql 8660 May 6 23:52 t.frm
-rw-rw---- 1 mysql mysql 192 May 6 23:52 t.MYD
-rw-rw---- 1 mysql mysql 2048 May 6 23:52 t.MYI
-rw-rw---- 1 mysql mysql 8590 May 10 01:27 topic.frm
-rw-rw---- 1 mysql mysql 40 May 10 01:27 topic.par
-rw-rw---- 1 mysql mysql 65 May 10 20:16 topic#P#test0.MYD
-rw-rw---- 1 mysql mysql 2048 May 10 20:16 topic#P#test0.MYI
-rw-rw---- 1 mysql mysql 0 May 10 20:13 topic#P#test1.MYD
-rw-rw---- 1 mysql mysql 1024 May 10 20:13 topic#P#test1.MYI
-rw-rw---- 1 mysql mysql 0 May 10 20:13 topic#P#test2.MYD
-rw-rw---- 1 mysql mysql 1024 May 10 20:13 topic#P#test2.MYI
发现 topic#P#test0.MYD文件大小增加了说明数据写入到了 topic#P#test0.MYD也就是写入到了分区我们之前创建的test0分区里面去了
我们现在再插入一条数据看下情况
mysql> insert into topic(`tid`,`title`) values(11,'h');
Query OK, 1 row affected (0.00 sec)
-rw-rw---- 1 mysql mysql 8590 May 10 01:27 topic.frm
-rw-rw---- 1 mysql mysql 40 May 10 01:27 topic.par
-rw-rw---- 1 mysql mysql 65 May 10 20:16 topic#P#test0.MYD
-rw-rw---- 1 mysql mysql 2048 May 10 20:16 topic#P#test0.MYI
-rw-rw---- 1 mysql mysql 65 May 10 20:18 topic#P#test1.MYD
-rw-rw---- 1 mysql mysql 2048 May 10 20:18 topic#P#test1.MYI
-rw-rw---- 1 mysql mysql 0 May 10 20:13 topic#P#test2.MYD
-rw-rw---- 1 mysql mysql 1024 May 10 20:13 topic#P#test2.MYI
插入了一条id为11的数据发现topic#P#test1.MYD的文件大小增加了说明数据写入到了分区为test1里面去了
我们查询下数据表里的数据看一下
mysql> select * from topic;
+-----+-------+
| tid | title |
+-----+-------+
| 1 | a |
| 11 | h |
+-----+-------+
2 rows in set (0.00 sec)
说明:mysql的partition按照范围(range)分区,是以某个字段的id(为int类型)的 范围来写入到对应范围的分区里面去的。
二:按照散列的点进行分区
mysql> create table area(
-> uid int(10),
-> uname char(6),
-> aid int)
-> engine=myisam charset utf8
-> partition by list(aid)(
-> partition hb values in (1),
-> partition hn values in (2),
-> partition gd values in (3),
-> partition gx values in (4));
Query OK, 0 rows affected (0.01 sec)
查看生成的文件信息
ls -all /data/local/mysql/data/test/
-rw-rw---- 1 mysql mysql 8618 May 10 19:52 area.frm
-rw-rw---- 1 mysql mysql 32 May 10 19:52 area.par
-rw-rw---- 1 mysql mysql 0 May 10 19:52 area#P#gd.MYD
-rw-rw---- 1 mysql mysql 1024 May 10 19:52 area#P#gd.MYI
-rw-rw---- 1 mysql mysql 0 May 10 19:52 area#P#gx.MYD
-rw-rw---- 1 mysql mysql 1024 May 10 19:52 area#P#gx.MYI
-rw-rw---- 1 mysql mysql 0 May 10 19:52 area#P#hb.MYD
-rw-rw---- 1 mysql mysql 1024 May 10 19:52 area#P#hb.MYI
-rw-rw---- 1 mysql mysql 0 May 10 19:52 area#P#hn.MYD
-rw-rw---- 1 mysql mysql 1024 May 10 19:52 area#P#hn.MYI
我们插入一条来自湖北的用户信息
mysql> insert into `area` (`uname`,`aid`) values('东子',1);
Query OK, 1 row affected (0.00 sec)
我们再来查看信息发现area#P#hb.MYD的文件写入了数据
-rw-rw---- 1 mysql mysql 8618 May 10 19:52 area.frm
-rw-rw---- 1 mysql mysql 32 May 10 19:52 area.par
-rw-rw---- 1 mysql mysql 0 May 10 19:52 area#P#gd.MYD
-rw-rw---- 1 mysql mysql 1024 May 10 19:52 area#P#gd.MYI
-rw-rw---- 1 mysql mysql 0 May 10 19:52 area#P#gx.MYD
-rw-rw---- 1 mysql mysql 1024 May 10 19:52 area#P#gx.MYI
-rw-rw---- 1 mysql mysql 27 May 10 20:03 area#P#hb.MYD
-rw-rw---- 1 mysql mysql 1024 May 10 20:03 area#P#hb.MYI
-rw-rw---- 1 mysql mysql 0 May 10 19:52 area#P#hn.MYD
-rw-rw---- 1 mysql mysql 1024 May 10 19:52 area#P#hn.MYI
我们再插入一条湖南人的信息
mysql> insert into `area` (`uname`,`aid`) values('lxm',2);
Query OK, 1 row affected (0.00 sec)
插入后我们发现area#P#hn.MYD文件的大小增加了说明写入了数据
-rw-rw---- 1 mysql mysql 8618 May 10 19:52 area.frm
-rw-rw---- 1 mysql mysql 32 May 10 19:52 area.par
-rw-rw---- 1 mysql mysql 0 May 10 19:52 area#P#gd.MYD
-rw-rw---- 1 mysql mysql 1024 May 10 19:52 area#P#gd.MYI
-rw-rw---- 1 mysql mysql 0 May 10 19:52 area#P#gx.MYD
-rw-rw---- 1 mysql mysql 1024 May 10 19:52 area#P#gx.MYI
-rw-rw---- 1 mysql mysql 27 May 10 20:03 area#P#hb.MYD
-rw-rw---- 1 mysql mysql 1024 May 10 20:03 area#P#hb.MYI
-rw-rw---- 1 mysql mysql 27 May 10 20:06 area#P#hn.MYD
-rw-rw---- 1 mysql mysql 1024 May 10 20:06 area#P#hn.MYI
查看一下表里面的数据
mysql> select * from area;
+------+--------+------+
| uid | uname | aid |
+------+--------+------+
| NULL | 东子 | 1 |
| NULL | lxm | 2 |
+------+--------+------+
2 rows in set (0.00 sec)
说明:按照散列的点进行分区,是根据插入信息的关联的一个id字段来自动写入对应的分区数据文件的,从而实现了表的分区。
mysql的partition分区的更多相关文章
- mysql primary partition分区
尝试把数据库一个表分区 ALTER TABLE user PARTITION BY RANGE(TO_DAYS(`date`)) ( PARTITION p1004 VALUES LESS THAN ...
- mysql Partition(分区)初探
mysql Partition(分区)初探 表数据量大的时候一般都考虑水平拆分,即所谓的sharding.不过mysql本身具有分区功能,可以实现一定程度 的水平切分. mysql是具有MERG ...
- MySQL partition分区I
http://blog.csdn.net/binger819623/article/details/5280267 一. 分区的概念二. 为什么使用分区?(优点)三. ...
- MYSQL之水平分区----MySQL partition分区I(5.1)
一. 分区的概念 二. 为什么使用分区?(优点) 三. 分区类型 四. 子分区 五. 对分区进行修改(增加.删除.分解.合并) 六 ...
- MySQL的表分区详解
这篇文章主要介绍了MySQL的表分区,例如什么是表分区.为什么要对表进行分区.表分区的4种类型详解等,需要的朋友可以参考下 一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysq ...
- MySQL的表分区(转载)
MySQL的表分区(转载) 一.什么是表分区 通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了. 如:某用户表的记录超过了600万条,那么就可以根据入库日期将表 ...
- zabbix使用mysql数据库 对表分区
zabbix删除历史数据 mysql 表自动分区.删除 ----2016年终总结 二 zabbix清理历史数据是个比较蛋疼的问题,尤其在监控数据较多时,一方面无法彻底释放历史数据空间,一方面数据库删除 ...
- MySQL 横向表分区之RANGE分区小结
MySQL 横向表分区之RANGE分区小结 by:授客 QQ:1033553122 目录 简介 1 RANGE分区 1 创建分区表 1 查看表分区 2 新增表分区 2 新增数据 3 分区表查询 3 删 ...
- 删除mysql数据库中表分区数据
删除mysql数据库中表分区数据 zabbix 几个大表创建了分区,由于磁盘空间告警,特将3月前的分区给予删除. 1.查看表的数据占用磁盘空间情况 2.登录mysql中,查看表的分区情况. 3.删除表 ...
随机推荐
- linux-shutdown命令说明
showdown命令: -k 不是真正关闭电脑,只是警告. -h 关闭后暂停 -r 关闭后重新引导 -c 取消已经运行的关闭操作 -n 不通过init直接关闭 -f 快速重新引导 time 关闭的时 ...
- 002——vue小结
1.new 一个vue对象的时候你可以设置他的属性,其中最重要的包括三个,分别是:data,methods,watch. 2.其中data代表vue对象的数据,methods代表vue对象的方法,wa ...
- Java 进阶7 并发优化 1 并行程序的设计模式
本章重点介绍的是基于 Java并行程序开发以及优化的方法,对于多核的 CPU,传统的串行程序已经很好的发回了 CPU性能,此时如果想进一步提高程序的性能,就应该使用多线程并行的方式挖掘 CPU的 ...
- Java复习3.变量.常量.String.
Java 中的变量常量数据类型 20131004 前言: 还是国庆节,无聊的很,就没事复习点Java的知识,其实C/C++基本上是现在大型企业面试的语言,但是多学习点Java是没有坏处的,而且,将来工 ...
- 【51nod-1521】一维战舰
爱丽丝和鲍博喜欢玩一维战舰的游戏.他们在一行有n个方格的纸上玩这个游戏(也就是1×n的表格). 在游戏开始的时候,爱丽丝放k个战舰在这个表格中,并不把具体位置告诉鲍博.每一只战舰的形状是 1×a 的长 ...
- yii2 联系我们发送邮件报错
为什么会报错,因为国内的邮件服务商要求发送邮件的人和设置的smtp服务器账号要相同,因为联系我们的是用户,也就是发件人是用户,而不是我们配置的邮箱,所有出错. 这里我用了个取巧的办法,发件人改为自己, ...
- js面向对象之:创建对象
最近在学习<js高级程序设计>,之前所接触的很多的js类库和jQuery插件都会用面向对象的方式来设计,而自己却还是停留在面向方法的阶段,所以今天好好记录一下学习的js创建对象. 第一种方 ...
- The capacitive screen technology - tadpole
- 课堂/会议同屏教学解决方案之RTSP/RTP over UDP组播解决方案
问题 在之前的博客<EasyIPCamera实现Windows PC桌面.安卓Android桌面同屏直播,助力无纸化会议系统>我们描述了一套基于EasyIPCamera的同屏功能,但是这个 ...
- MVC MVVM和传统三层的理解
才学疏浅,请勿喷,如果有理解不对的地方请留言 其实,每个小小的程序员都有个毛病,就是反复写一个东西会觉得这个东西没有新意. 就像让你写三层,你却还是觉得想写MVC模式. 软件小公司做B/S的大部分还是 ...