1.为什么需要分表和分区

  在开发的过程中,经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表。这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,如果涉及联合查询的情况,性能更加糟糕。分表和分区的目的就是减少数据库的负担,提高数据库的效率,就是提高表的增删改查。

2.分表

  分表是讲一个大表按照一定的规则分解成多张具有独立存储空间的实体表,我们可以称为子表,每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构文件。这些子表可以分布在同一块磁盘上,也可以在不同的机器。读写的时候根据事先定义好的规则得到对应的子表名,然后去操作它。

3.分区

  分区和分表相似,都是按照规则分解表。不同在于分表将大表分解为若干个独立的实体表,而分区是将数据分段划分在多个位置存放,可以是同一块磁盘,也可以在不同的机器。分区后,表面上是一张表,但数据散列到多个位置了。读写的时候操作的还是大表的名字,db自动去组织分区的数据。

4.分表和分区联系

  都能提高mysql的性能,在高并发状态下都有一个良好的表现。

·  分表和分区不矛盾,可以相互配合的,对于那些大访问量,并且表数据较多的表,我们可以采取分表和分区结合的方式(如果merge这种分表方式,不能和分区配合的话,可以用其他的分表),访问量不大,但是表数据很多的表,可以采取分区的方式。

  分表技术是比较麻烦的,需要手动创建子表,服务端读写的时候需要计算表名。采用merge好一些,但也要创建子表和配置子表之间的union关系。

  表分区相对于分表,操作方便,不需要创建子表。

5.分表的几种方式

  mysql集群

  它并不是分表,但起到了和分表相同的作用。集群可以分担数据库的操作次数,将任务分担到多台数据库上。集群可以读写分离,减少读写压力。从而提升数据库性能。

  自定义规则分表

  大表可以按照业务规则来分解为多个子表。通常为一下几种类型,也可以自己定义规则。

  Range(范围):这种模式允许将数据库划分不同范围。例如通过年份划分。

  Hash(哈希):这种模式允许通过对表的一个或多个列的Hash Key进行计算,最后通过这个Hash码不同数值对应的数据区域进行分区。例如可以建立一个对表主键进行分区的表。

  Key(键值):上面Hash模式的一种延伸,这里的Hash Key是MySQL系统产生的。

  List(预定义列表):这中模式允许系统通过预定义的列表的值来对数据进行分割。

  Composite(复合模式):以上模式的组合使用。

  分表与分区规则一样

  1.Range分表:

  设:表有四个字段 自增id 姓名 存款金额 存款日期

  存款日期最为规则分表,分别创建几个表

  2011年:account_2011

  2012年:account_2012

  ...

  2017年:account_2017

  读写的时候根据日期来查找对应的表名,需要手动来判断

  

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

  merge分表分为主表和子表,主表类似一个壳子,逻辑上封装了子表,实际上数据都是存储在子表中的。

  我们可以通过主表插入和查询数据,如果清楚分表规律,也可以直接操作子表。

  子表2011年

  CREATE TABLE `account_2011` (

  `id`  int(11) NOT NULL AUTO_INCREMENT ,

         `name`  varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFA  ULT NULL ,

  `money`  float NOT NULL ,

  `tradeDate`  datetime NOT NULL

  PRIMARY KEY (`id`))

  ENGINE=MyISAM

  DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci

  AUTO_INCREMENT=2

  CHECKSUM=0

  ROW_FORMAT=DYNAMIC

  DELAY_KEY_WRITE=0;

  子表2012年

  CREATE TABLE `account_2012` (

  `id`  int(11) NOT NULL AUTO_INCREMENT ,

     `name`  varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFA  ULT NULL ,

  `money`  float NOT NULL ,

  `tradeDate`  datetime NOT NULL

  PRIMARY KEY (`id`))

  ENGINE=MyISAM

  DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci

  AUTO_INCREMENT=2

  CHECKSUM=0

  ROW_FORMAT=DYNAMIC

  DELAY_KEY_WRITE=0;

  

  主表 所有年份

  CREATE TABLE `account_all` (

  `id`  int(11) NOT NULL AUTO_INCREMENT ,

     `name`  varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFA  ULT NULL ,

  `money`  float NOT NULL ,

  `tradeDate`  datetime NOT NULL

  PRIMARY KEY (`id`))

  ENGINE=MRG_MYISAM

  DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci

  UNION=(`account_2011`,`account_2012`)

  INSERT_METHOD=LAST

  ROW_FORMAT=DYNAMIC;

  创建主表的时候有个INERT_METHOD,指明插入的方式,取值可以是:0不允许插      入;FIRST插入到UNION中的第一个表;LAST插入到UNION的最后一个表。

通过主表查询的时候,相当于将所有子表合在一起查询。这样并不能体现分表的优       势,建议还是查询子表、

  分区的几种方式:

  Range:

create table range(

  id int(11),

  money int(11) unsigned not null,

  date datetime

  )partition by range(year(date))(

  partition p2007 values less than (2008),

  partition p2008 values less than (2009),

  partition p2009 values less than (2010)

partition p2010 values less than maxvalue);

  List:

create table list(

  a int(11),

  b int(11)

  )(partition by list (b)

  partition p0 values in (1,3,5,7,9),

  partition p1 values in (2,4,6,8,0)

 );

  

  Hash:

create table hash(

  a int(11),

  b datetime

  )partition by hash (YEAR(b)

  partitions 4;

  Key:

create table t_key(

  a int(11),

  b datetime)

  partition by key (b)

  partitions 4;

  分区管理:

  新增分区:

  ALTER TABLE sale_data

  ADD PARTITION (PARTITION p201010 VALUES LESS THAN (201011));

  

  删除分区:

  一旦删除了一个分区,也同时删除该分区所有的数据。

  ALTER TABLE sale_data DROP PARTITION p201010

  

  分区的合并:

  下面的SQL,将p201001 - p201009 合并为3个分区p2010Q1 - p2010Q3

  ALTER TABLE sale_data

  REORGANIZE PARTITION p201001,p201002,p201003,

  p201004,p201005,p201006,

  p201007,p201008,p201009 INTO

(

PARTITION p2010Q1 VALUES LESS THAN (201004),

PARTITION p2010Q2 VALUES LESS THAN (201007),

PARTITION p2010Q3 VALUES LESS THAN (201010)

);

  

MySQL 分表和分区的更多相关文章

  1. Mysql分表和分区的区别、分库分表介绍与区别

    分表和分区的区别: 一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看:mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这 ...

  2. mysql分表,分区的区别和联系

    一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘 ...

  3. Mysql分表和分区的区别

    一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘 ...

  4. MYSQL分表与分区

    什么是分表分区分表分区的区别实现方式上数据处理上提高性能上实现的难易度上mysql分表和分区的联系如何分区概述分区技术支持分区类型及举例注意应用场景示例订单表比预想中扩张速度快坑爹的日志表每半月一个分 ...

  5. Mysql分表和分区的区别、分库分表介绍与区别(转)

    分表和分区的区别: 一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看:mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这 ...

  6. mysql分表和分区实际应用简介

    一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘 ...

  7. Mysql分表和分区的区别、分库和分表区别

    一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看:mysql分表的3种方法. 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个 ...

  8. mysql 分表与分区

    一.操作环境 数据达到百w甚于更多的时候,我们的mysql查询将会变得比较慢, 如果再加上连表查询,程序可能会卡死.即使你设置了索引并在查询中使用到了索引,查询还是会慢.这时候你就要考虑怎么样来提高查 ...

  9. mysql分表和表分区详解

    为什么要分表和分区? 日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能 ...

随机推荐

  1. jQuery:总体掌握

    链式编程....方法多,属性无法得到对象进行链式.vs10自动完成.书籍锋利的jQuery vsdoc有智能提示开发时候用,开发完之后,换成min压缩版的. 经验:打开网站文件夹.可以把vs网站上的解 ...

  2. Java学习 第二节

    1.非递归求第四十个斐波那契数 package test; public class fibonacci2 { public static void main(String arg[]) { ; ; ...

  3. 根据条件决定是否为input设置只读属性

    代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <tit ...

  4. Ansible Playbook Variables

    虽然自动化存在使得更容易使事情重复,但所有的系统可能不完全一样. 在某些系统上,您可能需要设置一些与其他操作略有不同的行为或配置. 此外,一些观察到的远程系统的行为或状态可能需要影响如何配置这些系统. ...

  5. Java8 lambda表达式语法 1

    本文主要记录自己学习Java8的历程,方便大家一起探讨和自己的备忘.因为本人也是刚刚开始学习Java8,所以文中肯定有错误和理解偏差的地方,希望大家帮忙指出,我会持续修改和优化.本文是该系列的第一篇, ...

  6. webdriver简介及浏览器的驱动

     1.webdriver概述:  webdriver(selenium2=selenium1+webdriver)是一种用于web应用程序的自动化测试工具,它提供了一套友好的API,与selenium ...

  7. linux的文件类型和权限

    Linux下使用ll或ls -l查看文件的信息 (ll和ls-l的区别:ll会显示出当前目录下的隐藏文件,而ls -l不会)   文件信息分为:文件类型.权限.链接数.所属用户.所属用户组.文件大小. ...

  8. PAT L2-010 排座位(floyd)

    布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位.无论如何,总不能把两个死对头排到同一张宴会桌旁!这个艰巨任务现在就交给你,对任何一对客人,请编写程序告诉主人他们是否能被安排同席. 输入格式: ...

  9. IIS 设置404页面 显示系统找不到指定的文件

    1.原因就是IIS的普通用户没有访问404页面的权限,造成了自定义404页面无法显示.只需要将user用户组具有读的权限即可.

  10. 使用第三方容器服务,自动化部署.Net Core

    1.为什么用第三方,而不自建,有哪些第三方,最后实现的效果 a.尝试过自建,并成功了,但是很麻烦,要敲一堆命令,无法达到全自动化部署的要求. b.自建,就算用第三方的镜像包,感觉下载还是不快,不知道为 ...