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字段来自动写入对应的分区数据文件的,从而实现了表的分区。
转载于:https://www.cnblogs.com/lisqiong/p/5647907.html
mysql的partition分区相关推荐
- mysql in partition_MySQL Partition分区扫盲
MySQL从5.1.3开始支持Partition,你可以使用如下命令来确认你的版本是否支持Partition: mysql> SHOW VARIABLES LIKE '%partition%'; ...
- maxvalue mysql自动分区_mysql的partition分区
前言:当一个表里面存储的数据特别多的时候,比如单个.myd数据都已经达到10G了的话,必然导致读取的效率很低,这个时候我们可以采用把数据分到几张表里面来解决问题. 方式一:通过业务逻辑根据数据的大小通 ...
- mysql 表分区 django_MySQL partition分区I
Mysql5.1已经发行很久了,本文根据官方文档的翻译和自己的一些测试,对Mysql分区表的局限性做了一些总结,因为个人能力以及测试环境的原因,有可能有错误的地方,还请大家看到能及时指出,当然有兴趣的 ...
- mysql Partition(分区)初探
表数据量大的时候一般都考虑水平拆分,即所谓的sharding.不过mysql本身具有分区功能,可以实现一定程度 的水平切分. mysql是具有MERGE这种引擎的,就是把一些结构相同的MyIASM表作 ...
- 【mysql分区分表】mysql 按时间分区 【partition】
大家好,我是烤鸭: 今天分享一下有关 mysql 分区. 需求: 按时间分区. 对千万数据左右的表,进行分区,数据的增加量大概千万/年. 代码实现: 模拟之前已经存在的表: DROP TABL ...
- mysql partition 语法_MySQL partition分区小结
MySQL partition分区 分区概念 分区针对不同的数据库,具有不同的特性.在这里专门针对MySQL数据库而言.在MySQL数据库里,分区这个概念是从mysql 5.1才开始提供的.不过目前只 ...
- mysql 分区指定路径_[数据库]MySQL 指定各分区路径
[数据库]MySQL 指定各分区路径 0 2016-11-08 18:00:44 介绍 可以针对分区表的每个分区指定各自的存储路径,对于innodb存储引擎的表只能指定数据路径,因为数据和索引是存储在 ...
- 一文带你搞懂 MySQL 中的分区!
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | GrimMjx 来源 | https://ww ...
- mysql的hash分区_MySQL中的分区(五)HASH分区
HASH分区主要用来分散热点读,取保数据在预先确定个数的分区中尽可能的平均分布.对一个表执行HASH分区时,MySQL会对分区键应用一个散列函数,一次确定数据应该放在哪一个分区中. MySQL分区支持 ...
最新文章
- 使用python愉快地做高数线代题目~
- RADAR和LIDAR区别分析
- react控制组件的显示或隐藏, 根据state判断元素显示隐藏 , setState不实时生效解决方法
- Octavia Rocky UDP 负载均衡功能试验
- Bag of Words模型
- 创维e900s用的什么芯片_MT41K512M16HA-125_苹果XR用的是什么闪存芯片
- properties 配置 java_Java 操作Properties配置文件详解
- PAT_B_1050_C++(20分)
- NET问答: 对 Linq 中的 Union 和 Concat 的用法困惑
- [Qt入门]QTableWidget控件创建
- Python问题记录
- Windows forfiles(删除历史文件)
- apply_async进程不执行_[粉丝问答6]子进程进程的父进程关系
- Nginx 配置文件详细说明
- bzoj 2938: [Poi2000]病毒(AC自动机)
- python实现自动化打印
- html代码雨特效代码,html开发数字雨特效代码 - 贪吃蛇学院-专业IT技术平台
- 74HC595芯片单颗与级联的万能代码|2021-09-03
- MYSQL圆角矩形表示_圆角矩形“RoundRectShape”使用详解
- ai与虚拟现实_AI医疗的神话与现实
热门文章
- Mac平台下Opencv开发环境搭建
- 2012总结--第1篇--技术篇
- 第二章: 第二课 内容处理-插入图片
- SqlCommandBuilder
- u-boot移植第五弹——2013.10u-boot通过tftp下载到内存中运行
- drf4 视图与路由组件
- linux中断处理函数参数,第9章 设置ISR(中断处理函数)
- java 手势识别,AndroidStudio:手势识别
- python编写界面遍历_python和pywin32实现窗口查找、遍历和点击
- android onpreviewframe保存mp4_无需第三方工具!教你如何保存抖音完整版视频