mysql 主表存hash和子表的名字_【mysql】mysql分表和表分区详解

为什么要分表和分区?

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

什么是分表?

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

什么是分区?

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

mysql分表和分区有什么联系呢?

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

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

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

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

分表的几种方式:

1、mysql集群

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

2、自定义规则分表

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

Range(范围)–这种模式允许将数据划分不同范围。例如可以将一个表通过年份划分成若干个分区。

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

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

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

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

分表规则与分区规则一样,在分区模块详细介绍。

下面以Range简单介绍下如何分表(按照年份表)。

假设表结构有4个字段:自增id,姓名,存款金额,存款日期

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

2011年:account_2011

2012年:account_2012

……

2015年:account_2015

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

var getTableName = function() {

var data = {

name: 'tom',

money: 2800.00,

date: '201410013059'

};

var tablename = 'account_';

var year = parseInt(data.date.substring(0, 4));

if (year < 2012) {

tablename += 2011; // account_2011

} else if (year < 2013) {

tablename += 2012; // account_2012

} else if (year < 2014) {

tablename += 2013; // account_2013

} else if (year < 2015) {

tablename += 2014; // account_2014

} else {

tablename += 2015; // account_2015

}

return tablename;

}

3、利用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 DEFAULT 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 DEFAULT 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 DEFAULT 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

;

创建主表的时候有个INSERT_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)

);

转自:http://www.2cto.com/database/201503/380348.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/563316.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

加载gif_搞笑gif:这啥情况啊?笑容加载不出来了?

这无故的小眼神&#xff0c;我也很无奈呀。。。猫和狗对峙&#xff0c;气势上一定不能输几个菜呀&#xff0c;喝成这样&#xff01;这啥情况啊&#xff1f;笑容加载不出来了&#xff1f;高手在民间&#xff01;小青年瞬间变老头&#xff01;丈母娘来家了&#xff0c;说下班就能…

马匹赛跑java_java模拟龟兔赛跑

通过使用 java 中 Jlabel,Jbutton,JtextArea,JcomboBox 等 swing 组件来实现图形用户界面,同 时通过设置布局,背景,字体等来丰富界面,最大程度的模拟龟兔赛跑的场景......2、模拟龟兔赛跑 要求: 用图形用户界面实现。 能设置比赛时间,马匹的数量等等。...3、2 目标与总体方案(1…

排序千万级数据_MySQL 对于千万级的大表要怎么优化?我写了6000字的深度解读...

千万级大表如何优化&#xff0c;这是一个很有技术含量的问题&#xff0c;通常我们的直觉思维都会跳转到拆分或者数据分区&#xff0c;在此我想做一些补充和梳理&#xff0c;想和大家做一些这方面的经验总结&#xff0c;也欢迎大家提出建议。从一开始脑海里开始也是火光四现&…

java读取rvt文件数据_Revit二次开发之隐藏API 独立进程读取rvt文件

在项目中需要读取rvt文件&#xff0c;但是因为该格式为非公开格式&#xff0c;其数据需要revit的支持&#xff0c;但批量读取不可能一个一个用revit软件去打开。不过该方法还是需要revit的依赖&#xff0c;速度比开软件快了知道多少1.1. 新建一个控制台项目1.2. 添加Revit API引…

vscode自动加前缀_详解VScode自动补全CSS3前缀插件以及配置无效的解决办法

1.在vscode中搜索Autoprofixer2.在安装完成之后要配置在需要添加前缀的css文件上&#xff0c;右键点击命令面板&#xff0c;输入Autoprefixer CSS就好啦ps: 如果想要兼容性最好的话&#xff0c;需要在设置配置文件setting.json里加上(打开设置->搜索autoprefixer->点击在…

java类快速构造_程序员有什么办法能快速梳理java知识点?有这八张图就够了

一图胜千言&#xff0c;下面图解均来自Program Creek 网站的Java教程&#xff0c;目前它们拥有最多的票选。如果图解没有阐明问题&#xff0c;那么你可以借助它的标题来一窥究竟。1、字符串不变性下面这张图展示了这段代码做了什么String s "abcd";s s.concat(&quo…

php数组foreach循环添加键值对_循环 - PHP二维数组根据键值对获取一组数组 (不使用foreach)...

问 题$user array(0 > array(id > 1,name > 张三,email > zhangsansina.com,),1 > array(id > 2,name > 李四,email > lisi163.com,),2 > array(id > 5,name > 王五,email > 10000qq.com,),......);比如我想获取当id2时,该数组的全部内容…

uos配置 java 环境变量_CentOS 7.3 环境配置java和tomcat开机启动

Centos7下添加开机自启动服务和脚本 https://blog.csdn.net/GMingZhou/article/details/78677953安装部分参考我的博文&#xff0c;仅参考他的开机启动部分CentOS 7环境配置tomcat7开机启动 https://blog.csdn.net/tiantang_1986/article/details/537049661.安装 jdk-8u5-lin…

react全局方法_前端面试题 ---react

高阶组件相关什么是高阶组件&#xff0c;它有哪些运用&#xff1f;高阶组件就是一个函数&#xff0c;接收一个组件&#xff0c;经过处理后返回后的新的组件&#xff1b;高阶组件&#xff0c;不是真正意义上的组件&#xff0c;其实是一种模式&#xff1b;可以对逻辑代码进行抽离…

java数据库表不存在_如果Java生产代码中不存在并在JUnit中确认,则创建数据库表...

Code-Apprentice2javasqljunitjdbc我正在用Java编写数据库程序,并且想要创建一个表(如果它还不存在).我从中了解DatabaseMetaData.getTables()了如何在Java中检测SQL表的存在&#xff1f;而我正在尝试使用它:private boolean tableExists() throws SQLException {System.out.pr…

get方法请求返回一个文件_一键转换多种文件格式,完全免费,总有一个方法适合你...

相信各位小伙伴平时办公的时候&#xff0c;肯定经常需要对多种文件格式进行转换&#xff0c;但是下面这些非常好用的转换方法&#xff0c;你用过吗&#xff1f;接下来就带各位一探究竟&#xff0c;希望可以帮到你哦&#xff01;一、迅捷PDF转换器在线版1、文档转换首先我们可以…

java 堆排序方式_幾種排序方式的java實現(02:希爾排序,歸並排序,堆排序)

/** 希爾排序&#xff1a;先取一個小於n的整數d1作為第一個增量&#xff0c;* 把文件的全部記錄分成(n除以d1)個組。所有距離為d1的倍數的記錄放在同一個組中。* 先在各組內進行直接插入排序&#xff1b;然后&#xff0c;取第二個增量d2* 直至所取的增量dt1(dtpublic classShel…

jacoco入门_Android jacoco 代码覆盖率测试入门

前言最近同事搞了一个基于 jacoco 统计 Android 代码覆盖率测试的功能,可以统计每天手工测试的代码覆盖率.抱着好奇的心态,自己也学习一下 jacoco,陆陆续续搞了三天终于有点结果了.本文介绍仅仅在源码中加入少量代码就可以完成代码覆盖率覆测试.代码配置build.gradle在 app 目录…

java下文_java实现文件下载的两种方式

本文实例为大家分享了java实现文件下载的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下public HttpServletResponse download(String path, HttpServletResponse response) {try {// path是指欲下载的文件的路径。File file new File(path);// 取得文件名。String …

uinty粒子系统子物体变大_Unity的粒子系统(一)基础篇

简介闲来无事&#xff0c;仔细的学习一下粒子系统&#xff0c;也当是给自己做个笔记方便之后进行回顾。引擎版本&#xff1a;Unity2018.3创建一个ParticleSystem创建方式&#xff1a;1、Hierarchy-->Effects-->ParticleSystem第一种创建方式创建结果2、gameObject-->A…

java字符串string_Java字符串String方法总结

Java字符串创建与初始化实例。Java字符串String方法总结&#xff0c;包括字符串的大小写替转换&#xff0c;获取字符串长度的方法、截取字符串&#xff0c;去除字符串中的空格、StringBuffer类转换成String类等&#xff1a;java创建并初始化字符串的方法&#xff1a;1、使用字符…

java定义返回码常量_码出规范(四)常量定义

01各位屏幕前的读者朋友大家早上中午晚上凌晨好&#xff0c;本文是《码出规范》专题的第四篇&#xff0c;文中参考阿里巴巴最新发布的《Java开发手册》&#xff0c;结合《springboot2.x独门秘籍》专题中的项目开发进度&#xff0c;学以致用&#xff0c;让你在开发中码出高效&am…

centos下载mysql_python数据分析之路——centos下载并配置mysql与navicat的使用

python数据分析之路——centos下载并配置mysql与navicat的使用在之前的文章中已经说明了如何购买并配置一台自己的服务器&#xff0c;那么在安装完anaconda之后&#xff0c;为了之后方便用Django进行网站开发与数据分析&#xff0c;需要对数据库进行配置&#xff0c;那么在数据…

php数组遍历相同的元素覆盖_php获取数组中重复数据的两种方法

搜索热词代码如下:PHPfunction FetchRepeatMemberInArray($array) {// 获取去掉重复数据的数组$unique_arr array_unique ( $array );// 获取重复数据的数组$repeat_arr array_diff_assoc ( $array,$unique_arr );return $repeat_arr;} // 测试用例$array array (apple,ipho…

mysql 解压缩安装_[mysql] MySQL解压缩安装步骤

以前装的MySQL出问题了&#xff0c;只好卸载了。又下载了一个mysql-5.6.24-win32.1432006610.zip。msi文件直接安装就行了。这里需要解压到指定目录&#xff0c;配置后可使用。环境变量配置&#xff1a;在 mysql根目录下修改 my-default.ini :# These are commonly set, remove…