广告
返回顶部
首页 > 资讯 > 数据库 >转:Mysql 分区 分表相关总结
  • 616
分享到

转:Mysql 分区 分表相关总结

2024-04-02 19:04:59 616人浏览 独家记忆
摘要

拆分策略选择 其实拆分很灵活,有的是垂直切分,将一个库拆成两个或多个,将有相关联的表放在一个库里。有的是水平切分将数据量大的表按照一定逻辑进行拆分。个人感觉垂直切分的相对来说缓解了io的瓶颈,而水

引述

前段时间项目需要,一直在研究Mysql sharding,看了一些这方面的资料,也亲自实验测试了一些数据。在此,做个概括的笔记,方便以后回顾知识,其实大多是借鉴网络上各位前辈的,然后抱着学习态度去实践,积累属于自己的东西。

拆分策略选择

其实拆分很灵活,有的是垂直切分,将一个库拆成两个或多个,将有相关联的表放在一个库里。有的是水平切分将数据量大的表按照一定逻辑进行拆分。个人感觉垂直切分的相对来说缓解了io的瓶颈,而水平切分,目的是减轻了单个表或某些表读写的压力。 我们项目根据个人需求,采用的水平切分,没有去分库。之后要看看需要采用何种的切分了。 了解到的有: 分表、分区、MERGE引擎分表。

MERGE引擎分表

简介

先介绍merge表,此方法适用于MyISAM。我数据库的表都是采用InnoDB引擎的,所以首先就被pass了,但是还是在这里简单介绍下吧。 mysql 5.1 手册里的说的

An alternative to a MERGE table is a partitioned table, which stores partitions of a single table in separate files. Partitioning enables some operations to be perfORMed more efficiently and is not limited to the MyISAM storage engine.

改变到MERGE引擎表,意味着成为一个被分区的表,这样将单一的表各分区存储在分离的文件中。分区可以使一些操作效率更显著,并且不受MyISAM存储引擎的限制。(蹩脚的英语,各位看官多担待吧。)

以上应该是使用merge表的主要原因吧。

创建使用

能够创建MERGE表的要求,首先是一组数据结构完全相同的表,并且存储引擎为MyISAM。

让我们先创建一个

mysql> CREATE TABLE t1 (
    ->    a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ->    message CHAR(20)) ENGINE=MyISAM;
mysql> CREATE TABLE t2 (
    ->    a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ->    message CHAR(20)) ENGINE=MyISAM;
mysql> INSERT INTO t1 (message) VALUES ('Testing'),('table'),('t1');
mysql> INSERT INTO t2 (message) VALUES ('Testing'),('table'),('t2');
mysql> CREATE TABLE total (
    ->    a INT NOT NULL AUTO_INCREMENT,
    ->    message CHAR(20), INDEX(a))
    ->    ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST; 

之后查询

mysql> SELECT * FROM total;
+---+---------+ | a | message |
+---+---------+
| 1 | Testing | | 2 | table |
| 3 | t1      | | 1 | Testing |
| 2 | table   | | 3 | t2 |
+---+---------+ 

你创建了total表,只是相当于在t1,t2的表的基础上创建的,需要注意的是在单个表中的主键或唯一索引,放在MERGE后的total表中就不能再当唯一索引用了,这点应该比较好理解但还是要说一下的。 同时你可以drop或者ALTER TABLE tbl_name UNION=(...)改变表的数据集,这样可以让其动态变化,剔除不需要的。

使用场景

如果你的数据记录呈现一定时间规律,比如每天产生的一些需要记录的日志,可能你只需要最近一个月的或者最近几个月的,这样你可以每天或者一定时间创建一个数据表,当需要查询一段时间的数据,你只要将这段时间的数据表创建 一张总计的MERGE表。这样数据集可以控制在可控的范围呢,不错吧。so easy。

分表

分表其实想法上很简单,顾名思义就是将现有的一张数据量大的表去拆分。如果数据库的性能瓶颈在几个关键表上,这时你可以将分表列入你考虑的范围。

遇到的问题

我说说我在实验分表时遇到的问题和相关解决方式

1.如何去分表 根据什么策略把现有表中的数据分到多个表中,并且还有考虑到以后的扩展性上。 德问上的这篇讨论可以借鉴下,

  • 《mysql 分表,拆分策略都有哪些?各在什么情况下应用?》
  • 《又拍网拆分策略》

是建立一张索引表,用户id与数据库id对应,(这里他将相同结构的表分在了不同的数据库中进一步减少压力,但同时对于数据的同步也需要通过其他手段来解决),其本质也是分表了同时分库了。这么做的好处是便于以后的扩展,但损耗一点性能,因为会多一次查询嘛。

个人想法,这样索引表可能会成为新的瓶颈,除非用户不会一直增长哈。 我的做法属于另一种,写了个算法通过计算某列值,按照一定规律将数据大致均分在每个分表中。至于扩展性,写算法时候考虑进去了以后增加分表数的问题了。 选择哪种策略,是要看自己的表的业务特点了,方法没有绝对的优缺,还是要根据自己的需求选取。

2.分表之后主键的维护 分表之前,主键就是自动递增的bigint型。所以主键的格式已经提早被确定了,像什么uuid之类的就被直接pass掉了。 还有想过自己写一个主键生成程序,利用Java 的Atomic原子量特性,但是考虑还需要增加工作量并且高并发下,这里很可能是个隐患。 还有就是通过应用层上管理主键,如Redis中有原子性的递增。 网上较有名的策略是《Ticket Servers: Distributed Unique Primary Keys on the Cheap》, 大致意思是使用一张名Tickets64的MyISAM存储引擎表,专门用来存储主键,数据只有一行,用的话通过

REPLACE INTO Tickets64 (stub) VALUES ('a'); SELECT LAST_INSERT_ID(); 

来取。并且设置了两个库,相同的方法,只是每次增长的步长不同,防止一个宕掉,还可以稳定运行。 其他较好的文章 《数据库分库分表(sharding)系列(二) 全局主键生成策略》,《关于主键管理》,《分库分表(sharding)后主键全局唯一性的解决方案》

2.动态选择表名 表分好之后,问题又来了,数据库层我们的项目使用的是mybatis框架。SQL语句都写在了xml文件中,现在我需要动态的设置表名。 其实设置mybatis本身,就可以解决这个问题

statementType STATEMENT,PREPARED 或 CALLABLE 的一个。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED

只要把属性statementType设置为STATEMENT,表名就可以以参数形式传入。传入参数时要以美元符${columnName}这样传入参数,至于Statement,PreparedStatement 的区别我想大家应该都能知道的。

另一种解决方式,是使用《shardbatis插件》,它是开源的,可以实现数据水平切分功能,有兴趣的朋友可以了解下。

分区表

从mysql5.1之后,提供了一种partition引擎的表,看这句

In effect, different portions of a table are stored as separate tables in different locations. 实际上,一个表的各个部分可以以单独的个体表存储在不同的位置(略微蹩脚)

在我的理解,如果把一张表分区之后,不同分区放在不同磁盘位置上,对整体的读取是否更有益?

分区表优缺点

这里主要是看的mysql手册,我也就起到了个翻译的作用。

Partitioning makes it possible to store more data in one table than can be held on a single disk or file system partition. 相比一张表,只能存放在一块硬盘或者文件系统分区内。分区方式让存储更多数据成为了可能。

Data that loses its usefulness can often be easily removed from a partitioned table by dropping the partition (or partitions) containing only that data. Conversely, the process of adding new data can in some cases be greatly facilitated by adding one or more new partitions for storing specifically that data. 失效的数据通过dropping掉仅仅包含此数据的分区方式,更容易的被移除。反之,通过添加新的分区来存储一些新的数据,这种方式更加容易。

Some queries can be greatly optimized in virtue of the fact that data satisfying a given WHERE clause can be stored only on one or more partitions, which automatically excludes any remaining partitions from the search. Because partitions can be altered after a partitioned table has been created, you can reorganize your data to enhance frequent queries that may not have been often used when the partitioning scheme was first set up. This ability to exclude non-matching partitions (and thus any rows they contain) is often referred to as partition pruning, and was implemented in MySQL 5.1.6. 这句翻译起来很吃力,我就说下大致意思吧,当你以某列分区之后,查询语句where中如果可以指定特有分区或者一个范围的话,查询会得到优化。其实也好理解,因为你在where中指定分区,查询就会只去检索你指定的那块分区,其他的数据不会去检索。后部分说的是可以在创建好的分区上修改分区,使其更合理。

Queries involving aggregate functions such as SUM() and COUNT() can easily be parallelized. 那些聚集函数,比如SUM(),COUNT() 容易被并行处理。(听起来很酷哦)

这两篇文章写的比较不错,《MySQL分区表的优缺点》,《mysql分区表对分区函数的限制》。 在选择mysql 分区方案时,还有一个需要考虑的,在mysql的bug中有一个关于mysql分区表查询缓存的bug: 《Partitioning + Query Cache》,因为这个问题,mysql已经将分区表的查询缓存disable了,无论你是否开启查询缓存,都不会启用查询缓存。如果你在意这点,请慎重选择方案。

真实案例

网上一些好的sharding实例,附上链接,与君共享 《Database Sharding at Netlog, with MySQL and PHP》。《又拍网架构中的数据库分库设计》。 《Amazon's Dynamo》。 《Ticket Servers: Distributed Unique Primary Keys on the Cheap》。 有些需要翻下墙才能看,至于怎么翻墙相信各路大神都有自己的方法哈。

以上是关于,mysql三个拆分方案的总结,资料方面都是自己查找的所以不免有些会不准确,如有发现请务必告知,希望与各位共成长~~~。

note:后续还会考虑写个如何去在数据库层实际操作,建立分区分表以及数据导入测试相关的心得



https://my.oschina.net/OpenSourceBO/blog/353464
Https://my.oschina.net/u/914897/blog/492421
http://haitian299.GitHub.io/2016/05/26/mysql-partitioning/
http://www.itmmd.com/201411/208.html

您可能感兴趣的文档:

--结束END--

本文标题: 转:Mysql 分区 分表相关总结

本文链接: https://www.lsjlt.com/news/49130.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 转:Mysql 分区 分表相关总结
    拆分策略选择 其实拆分很灵活,有的是垂直切分,将一个库拆成两个或多个,将有相关联的表放在一个库里。有的是水平切分将数据量大的表按照一定逻辑进行拆分。个人感觉垂直切分的相对来说缓解了IO的瓶颈,而水...
    99+
    2022-10-18
  • mysql表分区实验总结
    草稿丢失,发表得不完整,稍后重新整理mysql表分区技术能有效解决水平拆分和垂直拆分的不足,可操作性和效率都更优。以下是一些实验总结。InnoDB引擎需先在配置文件中设置: innodb_file...
    99+
    2022-10-18
  • 操作MySQL表相关要义总结
    下面讲讲关于操作MySQL表相关要义,文字的奥妙在于贴近主题相关。所以,闲话就不谈了,我们直接看下文吧,相信看完操作MySQL表相关要义这篇文章你一定会有所受益。使用编辑器编辑指令edit创建表create...
    99+
    2022-10-18
  • mysql表的四种分区方式总结
    目录1、什么是表分区?2、表分区与分表的区别3、表分区有什么好处?4、分区表的限制因素5、如何判断当前MySQL是否支持分区? 6、MySQL支持的分区类型有哪些?6.1、...
    99+
    2022-11-13
  • MySQL分库分表总结讲解
    项目开发中,我们的数据库数据越来越大,随之而来的是单个表中数据太多。以至于查询变慢,而且由于表的锁机制导致应用操作也受到严重影响,出现了数据库性能瓶颈。 当出现这种情况时,我们可以考虑分库分表,即将单个数据...
    99+
    2022-10-18
  • MongoDB 主分片(primary shard)相关总结
    目录01 主分片是什么?02 如何迁移主分片01 主分片是什么?   分片集群中的每一个数据库都有一个主分片,这个主分片上保存了当前数据库中没有被分片的集合的数据,主分片(...
    99+
    2022-11-11
  • MySQL 外键约束和表关系相关总结
    目录外键(Foreign Key)如何确定表关系如何建立表关系一对多关系 - 员工表和部门表多对多一对一表关系总结外键(Foreign Key) 按照上述所说,一张表存储员工信息会极大的浪费资源,重复数据太多,这个...
    99+
    2022-05-18
    MySQL 外键约束 MySQL 表关系
  • MySQL分区建索引以及分区介绍总结
    目录MySQL 分区建索引介绍MySQL 分区介绍介绍总结MySQL 分区建索引介绍 mysql分区后每个分区成了独立的文件,虽然从逻辑上还是一张表其实已经分成了多张独立的表,从&l...
    99+
    2022-11-13
  • MySQL分区表管理命令汇总
    目录一、ANALYZE和CHECK PARTITION 分析和检查分区二、REPAIR 修复分区三、OPTIMIZE 分区四、REBUILD分区五、新增和删除分区前言: 分区是一种表...
    99+
    2022-11-13
  • Mssql和Mysql的相关安全性分析(转)
    Mssql和Mysql的相关安全性分析(转)[@more@]  数据库是电子商务、金融以及ERP系统的基础,通常都保存着重要的商业伙伴和客户信息。大多数企业、组织以及政府部门的电子数据都保存在各种数据库中,...
    99+
    2022-10-18
  • SqlServer关于分区表的相关知识点有哪些
    这篇文章主要讲解了“SqlServer关于分区表的相关知识点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SqlServer关于分区表的相关知识点有哪...
    99+
    2022-10-18
  • PostgreSQL中分区表查询相关的重要数据结构有哪些
    本篇内容介绍了“PostgreSQL中分区表查询相关的重要数据结构有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能...
    99+
    2022-10-18
  • MySQL普通表如何转换成分区表
    小编给大家分享一下MySQL普通表如何转换成分区表,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! ...
    99+
    2022-10-18
  • MySQL普通表怎么转换成分区表
    本篇内容介绍了“MySQL普通表怎么转换成分区表”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!版本:MySQL-5.7.32前言:对于业务繁...
    99+
    2023-06-30
  • JAVA正则表达式及字符串的替换与分解相关知识总结
    JAVA正则表达式及字符串的替换与分解 Java 提供了 java.util.regex 包来与正则表达式进行模式匹配 java.util.regex 包主要包括以下三个类: Pat...
    99+
    2022-11-12
  • mysql的普通表怎么转换成分区表
    这篇文章主要讲解了“mysql的普通表怎么转换成分区表”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql的普通表怎么转换成分区表”吧! ...
    99+
    2022-10-18
  • MySQL分区表和HBase的关系是什么
    MySQL分区表和HBase的关系是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。  创建 MySQL 分区数据  DROP ...
    99+
    2022-10-18
  • 关于MySQL分区表的一个性能BUG
    目录二、使用pt-pmap进行栈分析三、关于本列中瓶颈点的分析四、分区表中多次建立template的情况五、关于一个特殊的流程六、问题模拟七、总结一、问题描述 最近遇到一个问题,也...
    99+
    2022-11-12
  • MySQL系列关于NUll值的经验总结分析教程
    目录1.测试数据2.null值带给我们的不便影响3.空格、空值和null,我们应该怎么判断呢?1)空格、空值和null的区别2)出现了null值,我应该怎么办?1.测试数据 cr...
    99+
    2022-11-12
  • 【LeetCode算法成长之路】Java字符串相关类总结与经典题目分析
    前言 本文小新为大家带来 Java字符串相关类总结与经典题目分析 相关知识,具体内容包括不可变字符序列String介绍(包括:String 的特性,String 的构造器,String 与其他结构间...
    99+
    2023-09-10
    java 算法 leetcode
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作