MySQL分片方法

第一部分:

关系型数据库随时间的流逝慢慢的不能满足现在每秒大量的操作、很多打开的连 接、大量的数据和非常高的写比率。为避免这种情况的出现,很多大型站点和SaaS的应用开始使用 sharding技术和他们的关系型数据结合。

怎样对应用分片?下面列出的四点很简单:

1、 分析表schema得出分片该如何设置

2、开启多个MySQL 实例

3、根据shard配置,导入导出 数据

4、更新程序代码来支持shard配置

分析数据:

为了得到一个shard 配置,你 需要做下面三步:

1、列出表名和表的大小。 大表时最需要进行分片的,因为很多SQL命令经常 在表上执行。

2、列出外键(如果有的话)外键帮助我们了解表之间的关系,这样的表需要很明 智的划分,否则你的表将失去一致性

3、分析涉及到的SQL语句  一些SQL语句在shard环境 下是难以执行的。所以需要整理一份SQL语句来决定哪些表时不需要shard的。我们还能得出哪些表时访 问频率很高,哪些不是。

表划分规则:

在实施shard的时候,需明白并不是所有的表都会 被分片。因为sharding会限制SQL的书写(不允许在表之间进行join,表的唯一性,自增字段),你必须 强制修改应用代码。通常情况下一些表被shard,另一些表被复制到其他shard上。

确定哪些表时 需要被分片的;

对表进行shard的算法像下面描述的一样简单:

1、寻找最大的表,很多 表结构中都有几张大表,其余并不是。

2、分析sql语句:

是否表之间使用了join查询?

a、是,让其中较小的表作为一个全局表

b、如果不是,还要根据sql语句来分析访问频率 分析

  i、如果这些表访问不频繁,让他们成为全局表

  ii、找出访问频繁 的表尤其是那些写入比较严重的进行shard,然后跳到第2步确定他们真的可以被shard(无join操作)

一旦你确定了哪些表是将被shard的,那么下一步就是选择sharding keys ,多数情况下回使用表 的primary key作为shard key。如果某些表之间存在外键关系,那么使用外键作为shard key 也是可以 考虑的。

和数据库分区一样,sharding也有很多算法:hash,list,range等。一般情况下使用 list或者 hast算法来应对多个选择条件的情况。通过不同的DB来保存不同的用户信息。hash往往能够对 数据更加平均的进行分配。

下一步呢?

如果你是一个新的环境,那么可以跳过这一步啦 。

1、在所有的shard上对数据进行克隆,复制物理文件或者mysqldump都行

2、对于每个 shard(shard上的每个表)

 a、删除所有的索引

 b、删除所有多余的数据 (脚本搞定)

这个操作会产生很多的碎片,可以考虑建立一张临时表,只插入相关的记录,最 后删除原表,再重命名。

时间: 2025-01-02 04:46:55

MySQL分片方法的相关文章

简述MySQL分片中快速数据迁移_Mysql

推荐阅读:MySQL 数据库跨操作系统的最快迁移方法 mysql 备份与迁移 数据同步方法 操作实践背景: travelrecord表定义为10个分片,尝试将10个分片中的2个分片转移到第二台MySQL上,并完成记录, 要求最快的数据迁移做法,中断业务时间最短 思路一利用mysqldump: 在这里我们只针对mysql innodb engine,而且配置bin-log的数据库进行分析.因为是将10个分片中的两个分片进行迁移,其实就是数据库的迁移过程,就是将10个数据库中的两个数据迁移到另外一台

从SQL导入导出到MYSQL的方法

从sql导出到mysql的方法很多,现介绍一种无需编程,直接利用sql和mysql里的图形界面进行导入导出的简单方法. 前提是已经安装了sqlserver客户端和mysql的图形界面管理工具phpmyadmin. 在控制台根目录下打开sqlserver企业管理器,新建sqlserver组,根据自己的情况进行选择:然后新建sqlserver 注册,进行对sqlserver的连接.准备妥当后,下面就开始了: 首先打开数据转换服务,新建包,打开DTS界面,在连接中选择数据源进行配置.再选择将要转换到的

Linux系统无法使用访问MySQL解决方法

  Linux系统无法使用访问MySQL解决方法.MySQL是最为常见的关系型数据库管理系统,不过有不少用户在使用过程中也会遇到一些小问题,有Linux系统用户发现,在Linux系统无法访问MySQL,为什么会造成这样原因呢?又要怎么解决呢?让我们一起来寻找答案吧. Linux 1.问题及异常 ThreadPoolAsynchronousRunner - com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@75d6

PHP入门教程之PHP操作MySQL的方法分析_php技巧

本文实例讲述了PHP操作MySQL的方法.分享给大家供大家参考,具体如下: 设置Zend 软件所有 UTF-8 编码 设置单个项目 UTF-8 的编码 Demo1.php <?php header('Content-Type:text/html; charset=utf-8;'); //第一步,连接到 Mysql 服务器 3306 //第二步参数,服务器地址:第二个参数,服务器的用户名:第三个参数,服务器密码 //@ 如果出错了,不要出现警告或错误,直接忽略 //die 函数之前,先连接一下,报

实现PHP框架系列文章(6)mysql数据库方法_php实例

实现一个mysql数据库封装需要考虑的问题 1.使用方便性 采用直接sql语句操作方式.只要会写sql语句,那么将没有其他学习成本. uctphp框架提供的dba辅助封装类,用会之后将爱不释手. 使用前需要显示初始化并连接到数据库吗,当然不需要. 直到执行第一条sql语句之前,都不会去连接数据库,甚至不会new一个db对象. dba将会在合适的时机去连接数据库并执行初始化字符编码操作. 查询语句.不需要new一个查询构造器也不提供链式操作方式,那样复杂且低效. dba提供了以下的查询辅助函数.

在EF中使用MySQL的方法及常见问题_Mysql

有时需要在网上租用空间或数据库,Mysql成本低一些,所以想将sql server转成mysql-- 注意:在安装Mysql时要选择文字集为utf8,否则将不能使用中文(当前也可以在创建数据库时使用utf8,不过我不知道在ef生成数据库时如何设置,希望高手指点) 一.在项目中引用mysql的EF包 通过NuGet包管理器安装:EntityFramework6.1.3.MySql.Data.Entity6.9.8 也可以用nuget的命令行加入: Install-Package MySql.Dat

CentOS 7.0下使用yum安装mysql的方法详解_Mysql

CentOS7默认数据库是mariadb,配置等用着不习惯,因此决定改成mysql,但是CentOS7的yum源中默认好像是没有mysql的.为了解决这个问题,我们要先下载mysql的repo源. 1.下载mysql的repo源 $ wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm 2.安装mysql-community-release-el7-5.noarch.rpm包 $ sudo rpm -ivh mys

大数据量下MySQL插入方法的性能比较

文章讲的是大数据量下MySQL插入方法的性能比较,不管是日常业务数据处理中,还是数据库的导入导出,都可能遇到需要处理大量数据的插入.插入的方式和数据库引擎都会对插入速度造成影响,本文旨在从理论和实践上对各种方法进行分析和比较,方便以后应用中插入方法的选择. 插入分析 MySQL中插入一个记录需要的时间由下列因素组成,其中的数字表示大约比例: ·连接:(3) ·发送查询给服务器:(2) ·分析查询:(2) ·插入记录:(1x记录大小) ·插入索引:(1x索引) ·关闭:(1) 如果我们每插入一条都

php随机取mysql记录方法小结_php技巧

本文实例总结了php随机取mysql记录方法.分享给大家供大家参考.具体分析如下: 在php中要随机取mysql记录我们可以直接使用mysql_query来执行mysql中的select rand函数获取的数据并读出来,这里就来给大家简单介绍一下. 方法一,代码如下: 复制代码 代码如下: select * from tablename order by rand() limit 1 把 limit 后面的数值改为你想随机抽取的条数,这里只取一条. 方法二,代码如下: 复制代码 代码如下: $q