前言:当一个表里面存储的数据特别多的时候,比如单个.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分区的更多相关文章

  1. mysql primary partition分区

    尝试把数据库一个表分区 ALTER TABLE user PARTITION BY RANGE(TO_DAYS(`date`)) ( PARTITION p1004 VALUES LESS THAN  ...

  2. mysql Partition(分区)初探

    mysql Partition(分区)初探   表数据量大的时候一般都考虑水平拆分,即所谓的sharding.不过mysql本身具有分区功能,可以实现一定程度 的水平切分.  mysql是具有MERG ...

  3. MySQL partition分区I

    http://blog.csdn.net/binger819623/article/details/5280267 一.        分区的概念二.        为什么使用分区?(优点)三.    ...

  4. MYSQL之水平分区----MySQL partition分区I(5.1)

    一.        分区的概念 二.        为什么使用分区?(优点) 三.        分区类型 四.        子分区 五.        对分区进行修改(增加.删除.分解.合并) 六 ...

  5. MySQL的表分区详解

    这篇文章主要介绍了MySQL的表分区,例如什么是表分区.为什么要对表进行分区.表分区的4种类型详解等,需要的朋友可以参考下 一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysq ...

  6. MySQL的表分区(转载)

    MySQL的表分区(转载) 一.什么是表分区 通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了. 如:某用户表的记录超过了600万条,那么就可以根据入库日期将表 ...

  7. zabbix使用mysql数据库 对表分区

    zabbix删除历史数据 mysql 表自动分区.删除 ----2016年终总结 二 zabbix清理历史数据是个比较蛋疼的问题,尤其在监控数据较多时,一方面无法彻底释放历史数据空间,一方面数据库删除 ...

  8. MySQL 横向表分区之RANGE分区小结

    MySQL 横向表分区之RANGE分区小结 by:授客 QQ:1033553122 目录 简介 1 RANGE分区 1 创建分区表 1 查看表分区 2 新增表分区 2 新增数据 3 分区表查询 3 删 ...

  9. 删除mysql数据库中表分区数据

    删除mysql数据库中表分区数据 zabbix 几个大表创建了分区,由于磁盘空间告警,特将3月前的分区给予删除. 1.查看表的数据占用磁盘空间情况 2.登录mysql中,查看表的分区情况. 3.删除表 ...

随机推荐

  1. cocos对象池的使用

    enemy.js cc.Class({ extends: cc.Component, properties: { enemySpeed: 0, //设置加速度 }, //初始化当前节点的y坐标 ini ...

  2. iptables疑问总结(一)

    1.关于-j 的return说明 1. 从一个CHAIN里可以jump到另一个CHAIN, jump到的那个CHAIN是子CHAIN.2. 从子CHAIN return后,回到触发jump的那条规则, ...

  3. mac下csv乱码解决办法

    到csv目录下, 用终端执行以下命令: iconv -f UTF8 -t GB18030 a.csv >b.csv

  4. rsync的服务端和客户端搭建

    首先要看看有没有rsync,没有就按装一个rsync 1配置文件 然后创建rsyncd.conf文件,并添加如下内容(文件默认不存在) [root@chensiqi2 backup]# cat /et ...

  5. PHP工作笔记:离线执行php任务

    直接上代码,主要函数 ignore_user_abort(true);这个函数忽略了终端被关闭(打开的网页被关闭),后面 getfiles()这函数是执行采集任务的自定义函数,后面又配置了下路径打开写 ...

  6. Python中的单例设计模式

    1)设计模式: 是前人工作的总结和提炼.通常,被人们广泛流传的设计模式.     某一问题的特定解决方案,使用设计模式是为了可重用代码,是代码更容易被人理解, 增加代码的可用性. 2)单例设计模式: ...

  7. vue.js 源代码学习笔记 ----- instance proxy

    /* not type checking this file because flow doesn't play well with Proxy */ import config from 'core ...

  8. NamedParameterJdbcTemplate常用方法总结

    数据库结构 1.插入/修改/删除数据,使用update方法 插入数据1 API: int update(String sql, Map< String, ? > paramMap) 示例: ...

  9. iOS开发之解决WebView自适应内容高度

    这段时间写的项目中,有涉及到根据后端上传的表单内容,然后在移动端将内容排版重新展示的功能点,所以小小的写一下解决办法. 首先如果直接进行内容展示,或者进行sizeToFit的操作,那么可能会造成图片超 ...

  10. Openstack认证过程

    01.登陆界面或命令行通过RESTful API向Keystone获取认证信息: 02.Keystone通过用户请求认证信息,并生成auth-token返回给对应的认证请求: 03.界面或命令行通过R ...