为什么要分表

首先要知道什么情况下,才需要分表个人觉得单表记录条数达到百万到千万级别时就要使用分表了,分表的目的就在于此,减小数据库的负担,缩短查询时间.

表分割有两种方式:  

1水平分割:根据一列或多列数据的值把数据行放到两个独立的表中。
  水平分割通常在下面的情况下使用:
    表很大,分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了索引的层数,提高查询速度。
    表中的数据本来就有独立性,例如表中分别记录各个地区的数据或不同时期的数据,特别是有些数据常用,而另外一些数据不常用。
    需要把数据存放到多个介质上。
    水平分割会给应用增加复杂度,它通常在查询时需要多个表名,查询所有数据需要union操作。在许多数据库应用中,这种复杂性会超过它带来的优点,因为只要索引关键字不大,则在索引用于查询时,表中增加两到三倍数据量,查询时也就增加读一个索引层的磁盘次数。  

2垂直分割:把主码和一些列放到一个表,然后把主码和另外的列放到另一个表中。
  如果一个表中某些列常用,而另外一些列不常用,则可以采用垂直分割,另外垂直分割可以使得数据行变小,一个数据页就能存放更多的数据,在查询时就会减少I/O次数。 其缺点是需要管理冗余列,查询所有数据需要join操作。 

场景案例:

博客系统

  垂直分割:

    文章标题,作者,分类,创建时间等,是变化频率慢,查询次数多,而且最好有很好的实时性的数据,我们把它叫做冷数据。
    而博客的浏览量,回复数等,类似的统计信息,或者别的变化频率比较高的数据,我们把它叫做活跃数据。
    所以,在进行数据库结构设计的时候,就应该考虑分表,首先是纵向分表的处理。
    这样纵向分表后:
      首先存储引擎的使用不同,冷数据使用MyIsam 可以有更好的查询数据。活跃数据,可以使用Innodb ,可以有更好的更新速度。
      其次,对冷数据进行更多的从库配置,因为更多的操作是查询,这样来加快查询速度。对热数据,可以相对有更多的主库的横向分表处理。
      其实,对于一些特殊的活跃数据,也可以考虑使用memcache ,redis之类的缓存,等累计到一定量再去更新数据库.

  水平分割:

    当博客的量达到很大时候,就应该采取横向分割来降低每个单表的压力,来提升性能。
    例如博客的冷数据表,假如分为100个表,当同时有100万个用户在浏览时,如果是单表的话,会进行100万次请求,而现在分表后,就可能是每个表进行1万个数据的请求(因为,不可能绝对的平均,只是假设),这样压力就降低了很多很多。

mysql分表的方法: http://blog.csdn.net/heirenheiren/article/details/7896546

使用Merge存储引擎展示水平分表实例:

查看mysql的存储引擎

mysql> show engines  \G;

现实场景模拟

第一步: 创建表member

DROP table IF EXISTS member;
create table member(
id bigint auto_increment primary key,
name varchar(20),
sex tinyint not null default '0'
)ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

第二步:创建存储过程,插入百万数据

#如果存在已定义的存储过程inserts,删除掉
drop procedure IF EXISTS inserts; #自定义结束符
delimiter // #创建存储过程
create procedure inserts()
begin
DECLARE i int;
set i = 1;
WHILE(i <= 10) DO
insert into member(name,sex) values(concat('name',i),i%2);
SET i = i+1;
END WHILE;
end; #使用自定义结束符结束存储过程定义
// #还原结束符为;
delimiter ; #调用存储过程
call inserts();

MySQL的语法默认使用分号";"作为一条SQL语句结束的标志.可以使用delimiter命令将其修改成其他符号,如:"delimiter //" 表示以//作为提交符号.

为了演示分表,所以实例中插入10条数据模拟.

第三步:创建分表

#分表1#
DROP table IF EXISTS tb_member1;
create table tb_member1(
id bigint primary key auto_increment ,
name varchar(20),
sex tinyint not null default '0'
)ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; #分表2#
DROP table IF EXISTS tb_member2;
#复制表1
create table tb_member2 like tb_member1;

第四步:创建主表,这里主表的定义与要分的目标表有不同

#主表#
DROP table IF EXISTS tb_member;
create table tb_member(
id bigint auto_increment ,
name varchar(20),
sex tinyint not null default '0',
INDEX(id)
)ENGINE=MERGE UNION=(tb_member1,tb_member2) INSERT_METHOD=LAST AUTO_INCREMENT=1 ;

查询tb_member表的索引信息

mysql> show index from tb_member \G;

第五步:将目标表数据分到两个分表中去

INSERT INTO tb_member1(tb_member1.id,tb_member1.name,tb_member1.sex)
SELECT member.id,member.name,member.sex
FROM member where member.id%2=0 ; INSERT INTO tb_member2(tb_member2.id,tb_member2.name,tb_member2.sex)
SELECT member.id,member.name,member.sex
FROM member where member.id%2=1 ;

当然实际场景根据需要进行唯一标识操作,取hash啊什么的等等,这里只使用简单去求模分表.

第六步: 查看分表数据

第七步: 查看总表数据

这样就把表member中的数据分开了, 分成的表组为 tb_member为主表,tb_member1与tb_member2为分表.分表后,数据都是存放在分表里,总表只是一个外壳,存取数据发生在一个一个的分表里面。

对于merge表,需要注意的是  
1. 每个子表的结构必须一致,主表和子表的结构需要一致,
2. 每个子表的索引在merge表中都会存在,所以在merge表中不能根据该索引进行唯一性检索。
3. 子表需要是MyISAM引擎
4. REPLACE在merge表中不会工作
5. AUTO_INCREMENT 不会按照你所期望的方式工作

创建Mysql Merge表的参数 INSERT_METHOD有几个参数 。
  LAST  如果你执行insert 指令来操作merge表时,插入操作会把数据添加到最后一个子表中。
  FIRST  同理,执行插入数据时会把数据添加到第一个子表中。

转载请注明出处:[http://www.cnblogs.com/dennisit/p/3649931.html]

mysql分表场景分析与简单分表操作的更多相关文章

  1. 【MySQL 线上 BUG 分析】之 多表同字段异常:Column ‘xxx’ in field list is ambiguous

    一.生产出错! 今天早上11点左右,我在工作休息之余,撸了一下猫.突然,工作群响了,老大在里面说:APP出错了! 妈啊,这太吓人了,因为只是说了出错,但是没说错误的信息.所以我赶紧到APP上看看. 这 ...

  2. mysql myisam简单分表设计

    一般来说,当我们的数据库的数据超过了100w记录的时候就应该考虑分表或者分区了,这次我来详细说说分表的一些方法.目前我所知道的方法都是MYISAM的,INNODB如何做分表并且保留事务和外键,我还不是 ...

  3. MySQL分布式数据库架构:分库、分表、排序、分页、分组、实现教程

    MySQL分库分表总结: 单库单表 : 单库单表是最常见的数据库设计,例如,有一张用户(user)表放在数据库db中,所有的用户都可以在db库中的user表中查到. 单库多表 : 随着用户数量的增加, ...

  4. Mysql之Mycat读写分离及分库分表

    ## 什么是mycat ```basic 1.一个彻底开源的,面向企业应用开发的大数据库集群 2.支持事务.ACID.可以替代MySQL的加强版数据库 3.一个可以视为MySQL集群的企业级数据库,用 ...

  5. mysql 性能优化索引、缓存、分表、分布式实现方式。

    系统针对5000台终端测试结果 索引 目标:优化查询速度3秒以内 需要优化.尽量避免使用select * 来查询对象.使用到哪些属性值就查询出哪些使用即可 首页页面: 设备-组织查询 优化 避免使用s ...

  6. MySQL 高可用:mysql+mycat实现数据库分片(分库分表)

    本文引用于http://blog.csdn.net/kk185800961/article/details/51147029 MySQL 高可用:mysql+mycat实现数据库分片(分库分表) 什么 ...

  7. mysql如何查询多样同样的表/sql分表查询、java项目日志表分表的开发思路/按月分表

    之前开发的一个监控系统,数据库的日志表是单表,虽然现在数据还不大并且做了查询sql优化,不过以后数据库的日志表数据肯定会越来越庞大,将会导致查询缓慢,所以把日志表改成分表,日志表可以按时间做水平分表, ...

  8. MYSQL利用merge存储引擎来实现分表

      创建user1和user2两个分表 建表语句如下:只是表名不一样,其他字段信息及主键一致. CREATE TABLE IF NOT EXISTS user1( id INT(11) NOT NUL ...

  9. 【分库分表】sharding-jdbc实践—分库分表入门

    一.准备工作 1.准备三个数据库:db0.db1.db2 2.每个数据库新建两个订单表:t_order_0.t_order_1 DROP TABLE IF EXISTS `t_order_x`; CR ...

随机推荐

  1. 201521123121 《Java程序设计》第5周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 2. 书面作业 代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪句 ...

  2. 201521123052《Java程序设计》第1周学习总结

    1. 本周学习总结 1.认识Java,了解JVM.JRE与JDK,并下载与安装JDK: 2.设置好eclipse并使用eclipse完成简单的Java编程: 3.使用博客.码云与PTA,这些对Java ...

  3. 201521123007《Java程序设计》第14周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自 ...

  4. 201521123122 《java程序设计》第十四周学习总结

    ## 201521123122 <java程序设计>第十四周实验总结 ## 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 2. 书面作业 1. M ...

  5. PHP面向对象简单总结

    类和对象对象:一切东西都可以看做对象,对象是类的实例化.类:类是对象的抽象,用来描述众多对象共有的特征. 定义类 class成员变量 和 成员方法访问修饰符 public共有的 private 私有的 ...

  6. 框架应用:Spring framework (五) - Spring MVC技术

    软件开发中的MVC设计模式 软件开发的目标是减小耦合,让模块之前关系清晰. MVC模式在软件开发中经常和ORM模式一起应用,主要作用是将(数据抽象,数据实体传输和前台数据展示)分层,这样前台,后台,数 ...

  7. TCP/IP协议:OSI七层模型、TCP/IP四层模型的对比

    1. OSI七层和TCP/IP四层的关系 1.1 OSI引入了服务.接口.协议.分层的概念,TCP/IP借鉴了OSI的这些概念建立TCP/IP模型. 1.2 OSI先有模型,后有协议,先有标准,后进行 ...

  8. Spring配置文件的命名空间URI

    Spring配置文件介绍 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=" ...

  9. 随便讲讲我对于svn和git的想法

    1.SVN是集中式版本管理工具,而Git是分布式版本管理工具,这是核心区别. 二者都有集中的库,只是git偏向于分布式,用户可以再自己电脑上克隆一份自己的库,即使在断网的情况下也能够查看版本,创建分支 ...

  10. JVM菜鸟进阶高手之路三

    转载请注明原创出处,谢谢! 笨神大大分享: 小程序里面搜索:JVMPocket,这个小程序是笨神大大提供的,里面可以搜索相关JVM参数,用法. -XX:MaxTenuringThreshold,这个参 ...