1、为什么要分表和分区

日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表。这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能会更加糟糕。分表和表分区的目的就是减少数据库的负担,提高数据库的效率,通常点来讲就是提高表的增删改查效率。
2、什么是分表和分区
2.1 分表
分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,我们可以称为子表,每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构文件。这些子表可以分布在同一块磁盘上,也可以在不同的机器上。app读写的时候根据事先定义好的规则得到对应的子表名,然后去操作它。
2.2 分区
分区和分表相似,都是按照规则分解表。不同在于分表将大表分解为若干个独立的实体表,而分区是将数据分段划分在多个位置存放,可以是同一块磁盘也可以在不同的机器。分区后,表面上还是一张表,但数据散列到多个位置了。app读写的时候操作的还是大表名字,db自动去组织分区的数据。
分区的主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减响应时间。
2.3 mysql分表和分区有什么联系呢?
1)、都能提高mysql的性能,在高并发状态下都有一个良好的表现。
2)、分表和分区不矛盾,可以相互配合的,对于那些大访问量,并且表数据比较多的表,我们可以采取分表和分区结合的方式,访问量不大,但是表数据很多的表,我们可以采取分区的方式等。
3)、分表技术是比较麻烦的,需要手动去创建子表,app服务端读写时候需要计算子表名。采用merge好一些,但也要创建子表和配置子表间的union关系。
4)、表分区相对于分表,操作方便,不需要创建子表。
3、分表的几种方式
3.1 mysql集群
它并不是分表,但起到了和分表相同的作用。集群可分担数据库的操作次数,将任务分担到多台数据库上。集群可以读写分离,减少读写压力。从而提升数据库性能。
3.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.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中的最后一个表。
通过主表查询的时候,相当于将所有子表合在一起查询。这样并不能体现分表的优势,建议还是查询子表。
4、分区的几种方式
4.1 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 );
4.2 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) );
4.3 Hash
create table hash( a int(11), b datetime )partition by hash (YEAR(b) partitions 4;
4.4 key
create table t_key( a int(11), b datetime) partition by key (b) partitions 4;
4.5 分区管理
4.5.1 新增分区
ALTER TABLE sale_data ADD PARTITION (PARTITION p201010 VALUES LESS THAN (201011));
4.5.2 删除分区
当删除了一个分区,也同时删除了该分区中所有的数据。
ALTER TABLE sale_data DROP PARTITION p201010;
4.5.3 合并分区
下面的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数据库分区分表
# MySql数据库分区
# MySql数据库分表
# MySQL数据库分区功能的使用教程
# MySQL数据库分区概念及使用
# mysql数据库分区的使用
# 多个
# 我们可以
# 都是
# 几种
# 若干个
# 有什么
# 几个
# 都有
# 有个
# 第一个
# 也要
# 不需要
# 都能
# 是指
# 也可
# 可以直接
# 自定义
# 详细介绍
# 表面上
# 并不能
相关文章:
浅谈Javascript中的Label语句
淘宝制作网站有哪些,淘宝网官网主页?
javascript基本数据类型及类型检测常用方法小结
seo网站制作优化,网站SEO优化步骤有哪些?
深圳网站制作培训,深圳哪些招聘网站比较好?
建站之星代理费用多少?最新价格详情介绍
如何选择网络建站服务器?高效建站必看指南
ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?
如何快速搭建FTP站点实现文件共享?
如何零基础开发自助建站系统?完整教程解析
专业网站制作服务公司,有哪些网站可以免费发布招聘信息?
如何通过.red域名打造高辨识度品牌网站?
重庆市网站制作公司,重庆招聘网站哪个好?
清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?
如何通过商城免费建站系统源码自定义网站主题?
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何快速搭建个人网站并优化SEO?
,sp开头的版面叫什么?
详解jQuery中基本的动画方法
唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?
网站好制作吗知乎,网站开发好学吗?有什么技巧?
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
外贸公司网站制作,外贸网站建设一般有哪些步骤?
c++怎么用jemalloc c++替换默认内存分配器【性能】
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
已有域名如何快速搭建专属网站?
如何选择高效响应式自助建站源码系统?
网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?
深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?
如何在Tomcat中配置并部署网站项目?
免费公司网站制作软件,如何申请免费主页空间做自己的网站?
如何快速查询网址的建站时间与历史轨迹?
济南网站制作的价格,历城一职专官方网站?
打鱼网站制作软件,波克捕鱼官方号怎么注册?
官网自助建站平台指南:在线制作、快速建站与模板选择全解析
c# await 一个已经完成的Task会发生什么
高端企业智能建站程序:SEO优化与响应式模板定制开发
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】
建站之星好吗?新手能否轻松上手建站?
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
如何通过万网虚拟主机快速搭建网站?
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
建站之星IIS配置教程:代码生成技巧与站点搭建指南
建站之星导航菜单设置与功能模块配置全攻略
如何通过cPanel快速搭建网站?
如何登录建站主机?访问步骤全解析
建站OpenVZ教程与优化策略:配置指南与性能提升
如何用PHP快速搭建CMS系统?
高防服务器租用指南:配置选择与快速部署攻略
*请认真填写需求信息,我们会在24小时内与您取得联系。