mysql使用MRG_MyISAM(MERGE)实现水平分表

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

在MySql中数据的优化尤其是大数据量的优化是一门很大的学问,当然其它数据库也是如此,即使你不是DBA,做为一名程序员掌握一些基本的优化信息,也可以让你在自己的程序开发中受益匪浅。当然数据库的优化有很多的方方面面,本篇主要讲,Mysql的水平分表技术,也可以说是其技术的其中之一。

在使用水平分表时,首先问下自己几个问题。

第一、为什么要水平分表?

第二、什么时候需要水平分表?

第三、怎样实现水平分表?

一、为什么要水平分表?

简而言之,当单表数据量过大时,无法对其进行有效的维护,以及查询速度严重变慢时,我们就需要对其时行水平分表

二、什么时候需要水平分表?

在数据库结构的设计中,需要充分考虑后期数据的增长量和增长速度,如果后期的数据增长量过快,以及后期数据量巨大,就需要使用水平分表。

三、怎样实现水平分表?

其实水平分表的方法,很多,但个人觉得结合程序的增删改查,本篇介绍的方法MRG_MySIAM存储引擎(MERGE存储引擎)个人觉得还是比较简单方便的,虽然性能方面与其它分表技术相比可能不是第一,但就使用程序对其的操控性来说,个人觉得还是很不错的。

MERGE存储引擎基本介绍和使用规范说明【以下截自MySql手册】:

MERGE存储引擎,也被认识为MRG_MyISAM引擎,是一个相同的可以被当作一个来用的MyISAM表的集合“相同”意味着所有表同样的列和索引信息。你不能合并列被以不同顺序列于其中的表,没有恰好同样列的表,或有不同顺序索引的表。而且,任何或者所有的表可以用myisampack来压缩。表选项的差异,比如AVG_ROW_LENGTH, MAX_ROWS或PACK_KEYS都不重要。

当你创建一个MERGE表之时,MySQL在磁盘上创建两个文件。文件名以表的名字开始,并且有一个扩展名来指明文件类型。一个.frm文件存储表定义,一个.MRG文件包含被当作一个来用的表的名字。这些表作为MERGE表自身,不必要在同一个数据库中。

你可以对表的集合用SELECT, DELETE, UPDATE和INSERT。你必须对你映射到一个MERGE表的这些表有SELECT, UPDATE和DELETE 的权限。

如果你DROP MERGE表,你仅在移除MERGE规格。底层表没有受影响。

当你创建一个MERGE表之时,你必须指定一个UNION=(list-of-tables)子句,它说明你要把哪些表当作一个来用。如果你想要对MERGE表的插入发生在UNION列表中的第一个或最后一个表上,你可以选择地指定一个INSERT_METHOD选项。使用FIRST或LAST值使得插入被相应地做在第一或最后一个表上。如果你没有指定INSERT_METHOD选项,或你用一个NO值指定该选项。往MERGE表插入记录的试图导致错误。

大致了解了MERGE存储引擎的基本介绍后,就让我们真正开始动手吧。

在分表的我们必须考虑如下问题:

1、根据什么样的规则来实现分表,即通过什么样的规则来插入不同的数据表?

2、即使分表成功,那么程序对其的处理是否简洁?

下面以下实例来说明,

假设我们有个邮件服务器,需要存储很多很多用户的邮件,为了解决后期数据量具大问题,我们就需要使用水平分表技术。

以什么样的规则来实现分表,分表数据如何确定?

首先我们必须大概估算以后的数据量会多大,分多少张表比较合适,从而来确定分表规则。

以我的情况为例,

我觉得以邮件的发送时间来计算,按天来划分,分为31张表比较合适。

那么我的分表规则,则如下设计,:

$ruleNum = date(j,$saveTime);
CREATE TABLE `email` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `euid` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT '帐号ID',
  `uid` char(50) NOT NULL COMMENT '邮件UID',
  `reciever` char(255) NOT NULL COMMENT '收件人',
  `sender` char(255) NOT NULL COMMENT '发送人',
  `sendTime` int(10) unsigned NOT NULL DEFAULT '0',
  `sendTitle` char(100) NOT NULL COMMENT '主题 ',
  `type` char(50) NOT NULL COMMENT '类型',
  PRIMARY KEY (`id`),
) ENGINE=MRG_MyISAM
 DEFAULT CHARSET=utf8 
UNION=(`email_1`,`email_2`,`email_3`,`email_4`,`email_5`,`email_6`,`email_7`,`email_8`,`email_9`,`email_10`,`email_11`,`email_12`,`email_13`,`email_14`,`email_15`,`email_16`,`email_17`,`email_18`,`email_19`,`email_20`,`email_21`,`email_22`,`email_23`,`email_24`,`email_25`,`email_26`,`email_27`,`email_28`,`email_29`,`email_30`,`email_31`);

首先创建一张MERGE存储类型的主表,

然后再批量创建31张MyISAM存储类型的数据表。

OK,此时创建完成后,我们需要做的是什么?

当然,第一步肯定是写入数据。此时我们的分表规则就有了用武之地了。

$sql = "INSERT INTO email_{$ruleNum}(....) VALUES(.....);"

此时完全可以正确的写入,并且在Email表中也会存在,是不是很OK。

但别高兴太早,我们要做的远远不止这些。

首先,因为ID是Auto_Increment,你完全可以不用管,因为每次插入不同的数据表都会有不同的ID,但问题是当你在EMAil这个Merge类型表中查看时你会发现,会有很多重复的ID,因为每张表的ID在email表中展现可能会有大量重复。这对我们修改和删除会有极大的影响,如果没有惟的ID,默认修改是根据排序来分别的,当然不可以。

所以在数据写入时,我们必须还要手动增加ID,来保证整个数据的ID都是惟一的。

方法当然有很多种,简单介绍下我的做法,

我直接新建了一张表就一个字段:


在每次新增完成数据后,都会使用触发器自动将此表中的数据值+1,而在每次读取时,先读取此表,获取下一个ID,这样就能保证数据ID永远惟一。

PS:也可以将此ID值存入文件,前提是在不会丢失的情况下。或其它都OK。

写入问题解决后,就剩下UPDATE,DELETE,SELECT了,这些现在都已不是问题,我们直接操作Email这个Merge类型表即可,(Mysql手册也有详细的介绍,可自行查看)

INSERT:

SELECT * FROM eamil where ($where) limit 20,10;

UPDATE:

UPDATE email SET username='$username' WHERE id=10

DELETE:

DELETE FROM email WHERE id=11

这只是一种MySql的水平分表方法,如果数据表较少的话,也可以使用

union 联合查询来实现数据表分表联合查询。

其它方法,网上也有很多,可自行查看。

希望此篇博文对大家有用,最后,分享经验,享受开源。

转载请注明:CRCMS » mysql使用MRG_MyISAM(MERGE)实现水平分表

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3月前
|
分布式计算 DataWorks 关系型数据库
DataWorks产品使用合集之ODPS数据怎么Merge到MySQL数据库
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
3月前
|
存储 SQL 关系型数据库
(二十三)MySQL分表篇:该如何将月增上亿条数据的单表处理方案优雅落地?
前面《分库分表的正确姿势》、《分库分表的后患问题》两篇中,对数据库的分库分表技术进行了全面阐述,但前两篇大多属于方法论,并不存在具体的实战实操,而只有理论没有实践的技术永远都属纸上谈兵,所以接下来会再开几个单章对分库分表各类方案进行落地。
322 3
|
4月前
|
算法 搜索推荐 NoSQL
面试题MySQL问题之分库分表后的富查询问题处理如何解决
面试题MySQL问题之分库分表后的富查询问题处理如何解决
50 3
|
4月前
|
消息中间件 关系型数据库 MySQL
实时计算 Flink版产品使用问题之从MySQL数据库中捕获变更数据并进行实时处理如何按天分表同步CDC数据
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
4月前
|
SQL 关系型数据库 MySQL
mysql面试之分库分表总结
mysql面试之分库分表总结
76 0
|
5月前
|
关系型数据库 MySQL 数据库
深入探讨MySQL分表策略与实践
深入探讨MySQL分表策略与实践
289 0
|
14天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
29 1
|
16天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
30 4
|
1月前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
64 3
Mysql(4)—数据库索引
|
23天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
116 1
下一篇
无影云桌面