前言:当一个表里面存储的数据特别多的时候,比如单个.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. shiro:10个过滤器;10个jsp标签;5个@注解

    10个过滤器 过滤器简称 对应的java类 anon org.apache.shiro.web.filter.authc.AnonymousFilter authc org.apache.shiro. ...

  2. Java内存状况查看方法和分析工具

    Java本身提供了多种丰富的方法和工具来帮助开发人员查看和分析GC及其JVM内存的状况,同时开源界也有一些工具用于查看和分析GC和JVM内存的状况. 通过这些分析,可以排查程序中内存泄露的问题及调优程 ...

  3. SSM整合Redis

    前言 服务端缓存的意义大多数在于减轻数据库压力,提供响应速度,而缺点也是显而易见的,会带来缓存与数据库一致性问题.当然,Redis还可以作为分布式锁. Redis 想在项目中使用Redis需要做的事情 ...

  4. 2: 使用Prism初始化程序 Initializing Applications Using the Prism Library 5.0 for WPF(英汉对照版)

    This topic addresses what needs to happen to get a Prism for WPF application up and running. A Prism ...

  5. Qt实现简单的单例模式

    单例模式十分的常见也很常用,Boost库中就有单例的泛型实现,Qt中,可以利用原子指针来实现一个单例模式: class SingleTon{ public: static SingleTon & ...

  6. iOS笔记之常用工具

    CocoaPods: 类库管理工具,使用教程见http://www.devtang.com/blog/2014/05/25/use-cocoapod-to-manage-ios-lib-depende ...

  7. TF随笔-7

    求平均值的函数 reduce_mean axis为1表示求行 axis为0表示求列 >>> xxx=tf.constant([[1., 10.],[3.,30.]])>> ...

  8. MDN搜索结果自动跳转中文地址

    MDN社区(即Mozilla开发者社区)具有很多高质量中英文文档.它是我开发时遇到概念模糊的地方经常访问的网站.因为默认搜索一些代码,优先显示的都是英文.但是恰恰这些显示的英文文档是有中文的.每次都是 ...

  9. MySQL基础(《MySQL必知必会》简单总结)

    使用MySQL # 选择数据库 USE database_name; # 显示数据库 SHOW DATABASES; # 显示当前数据库的表 SHOW TABLES; # 显示特定表有哪些列 SHOW ...

  10. 【pandas】pandas.Series.str.split()---字符串分割

    原创博文,转载请注明出处! 本文代码的github地址       series中的元素均为字符串时,通过str.split可将字符串按指定的分隔符拆分成若干列的形式. 例子: 拆分以逗号为分隔符的字 ...