[ZZ]MySQL分表分块到主从

1. 记得大学的时候搭建一个网站,数据库,开发环境,web服务一股脑全部在一台机器上,用几个数M的大图片做webpage的背景,觉得很cool。没有访问就没有数据库优化问题。

2. 以MySQL为例,当一个table中有数百万条记录的时候,查询自然就会越来越慢。这时通常做的就是分库分表。
分库:垂直拆分
简单的说就是将1个DB中不同的table人为的分离到不同的DB。
比如:DB中存有用户信息和群信息2个table,用户又属于一个群。把原来的1个DB分成2个。一个存用户DB,一个群DB,这就是分库。
优势:对于不同的库可以有不同的操作逻辑,自然分散数据库压力。
问题:不能跨库查询,不能保证数据的一致性和完整性。例如,插入用户信息的同时应该把用户加入群中。分库后设计2个DB的操作。不能用transaction来完成。

分表:水平拆分
我们有一个user的table,因为它过大。我们按照userID这个字段的最后一位来拆分。将user拆分为user_0, user_1...user_9。这样也可以分散压力。不过程序上的复杂度也会提高。
拆分的Rule是非常重要,要考虑到各个表的平衡和可扩展性。
CREATE TABLE user (id INT, name DECIMAL(7,2), date DATE) ENGINE=INNODB
PARTITION BY HASH(MONTH(date)) PARTITIONS 12;
上面就是一个按照月份拆分的例子。

Memcached(缓存技术)+ 分库分表 是初期用来缓解数据库压力的办法。

3. 主从设置,MySQL Replication为例。
一主多从:
一般来说是由一台主库和多台从库组成,从库可以作备份和容灾,当主库出现故障时,从库就手动变成主库。
(1)对Master(主库)的操作都记录在log中。
(2)Slave(从库)将主库的log events拷贝到自己的relay log中。
(3)Slave重做log中的事件,反映在从库中。
一般写操作master,读从slave中取得。多个slave可以分流查询的压力。一般主从的设置都是配合Proxy或Amoeba来操作,下面将介绍。

具体设置参考:

http://aciddrop.com/2008/01/10/step-by-step-how-to-setup-mysql-database-replication/

主从+MySQL Proxy(MySQL Amoeba)
在主从设置的基础上,还可以通过使用Proxy或Amoeba来将读写分离,从而减轻数据库压力。

以Mysql Proxy为例。Proxy相当于一个处于Client和Server之间的连接器。由Lua脚本写成。使用其可以将读写分离。对于写的操作,我们让master来处理,写之后Slave自动同步master的更改。而对于读,我们用slave来处理。

多主多从:
多主多从的设置,是一个loop环形,每个DB既是前一个DB的Slave又是后一个的Master。
注意的地方就是在对各个DB做插入操作时,要设置好auto_increment_increment和auto_increment_offset.为了防止最后merge时出现的主键冲突错误。
优势: 一个Master挂掉,也还可以继续DB操作。每个DB都可以进行读写,分散压力。
多主多从的设计,写操作不在只能在一个master上进心,而是可以在任何DB上进行。读的操作压力也可以更好的分散到各个DB中。

原地址:

http://blog.sina.com.cn/s/blog_7e89c3f501012vpr.html

时间: 2024-10-11 07:21:54

[ZZ]MySQL分表分块到主从的相关文章

mysql分表的三种方法

mysql分表的3种方法 一,先说一下为什么要分表 当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了.分表的目的就在于此,减小数据库的负担,缩短查询时间. 根据个人经验,mysql执行一个sql的过程如下:1,接收到sql;2,把sql放到排队队列中 ;3,执行sql;4,返回执行结果.在这个执行过程中最花时间在什么地方呢?第一,是排队等待的时间,第二,sql的执行时间.其实这二个是一回事,等待的同时,肯定有sql在执行.所以我们要缩短sql的执行

mysql分表与分区表

mysql分表与分区表 转自:http://blog.51yip.com/mysql/949.html   一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上 一,先说一下为什么要分表 当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了.分表的目的就在于此,减小数据库的负担,缩短

Mysql分表和分区的区别、分库分表介绍与区别

分表和分区的区别: 一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看:mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上,具体请参考mysql分区功能详细介绍,以及实例 二,mysql分表和分区有什么区别呢 1,实现方式上 a),mysql的分表是真正的分表,一张表分成很多表后,每一个小表都是完正的一张表,都对应三个文件,一个.MYD数据文件,.MYI索引文件,.frm表

mysql分表方法-----MRG_MyISAM引擎分表法

一般来说,当我们的数据库的数据超过了100w记录的时候就应该考虑分表或者分区了,这次我来详细说说分表的一些方法.目前我所知道的方法都是MYISAM的,INNODB如何做分表并且保留事务和外键,我还不是很了解. 首先,我们需要想好到底分多少个表,前提当然是满足应用.这里我使用了一个比较简单的分表方法,就是根据自增id的尾数来分,也就是说分0-9一共10个表,其取值也很好做,就是对10进行取模.另外,还可以根据某一字段的md5值取其中几位进行分表,这样的话,可以分的表就很多了. 好了,先来创建表吧,

mysql 分表与分区

一.操作环境 数据达到百w甚于更多的时候,我们的mysql查询将会变得比较慢, 如果再加上连表查询,程序可能会卡死.即使你设置了索引并在查询中使用到了索引,查询还是会慢.这时候你就要考虑怎么样来提高查询速度了. 抛弃其他的不讲,只从mysql本身的优化来讲,我所知道的方法有三种:mysql集群,mysql分表,mysql分区 二.mysql集群 mysql集群成本比较高,不过这不是这里讲的重点,后期开一篇文章,专门来讲这方面的知识. 三.mysql分表 1. 当数据达到百w,千w的时候,我们就想

mysql分表和表分区详解

为什么要分表和分区? 日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能会更加糟糕.分表和表分区的目的就是减少数据库的负担,提高数据库的效率,通常点来讲就是提高表的增删改查效率. 什么是分表? 分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,我们可以称为子表,每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构文件.这些子表可以分布在

MYSQL 分表原理(转)

简介:引用MySQL官方文档中的一段话:MERGE存储引擎,也被认识为MRG_MyISAM引擎,是一个相同的可以被当作一个来用的MyISAM表的集合."相同"意味着所有表同样的列和索引信息.你不能合并列被以不同顺序列于其中的表,没有恰好同样列的表,或有不同顺序索引的表.而且,任何或者所有的表可以用myisampack来压缩.例子:mysql> show engines;+--------------------+---------+------------------------

mysql分表研究

分表是分散数据库压力的好方法. 分表,最直白的意思,就是将一个表结构分为多个表,然后,可以再同一个库里,也可以放到不同的库. 当然,首先要知道什么情况下,才需要分表.个人觉得 单表记录条数达到百万到千万级别时就要使用分表了. 1,分表的分类 1>纵向分表 将本来可以在同一个表的内容,人为划分为多个表.(所谓的本来,是指按照关系型数据库的第三范式要求,是应该在同一个表的.) 分表理由:根据数据的活跃度进行分离,(因为不同活跃的数据,处理方式是不同的) 案例: 对于一个博客系统,文章标题,作者,分类

使用Merge存储引擎实现MySQL分表

一.使用场景 Merge表有点类似于视图.使用Merge存储引擎实现MySQL分表,这种方法比较适合那些没有事先考虑分表,随着数据的增多,已经出现了数据查询慢的情况. 这个时候如果要把已有的大数据量表分开比较痛苦,最痛苦的事就是改代码.所以使用Merge存储引擎实现MySQL分表可以避免改代码. Merge引擎下每一张表只有一个MRG文件.MRG里面存放着分表的关系,以及插入数据的方式.它就像是一个外壳,或者是连接池,数据存放在分表里面. 对于增删改查,直接操作总表即可. 二.建表 1.用户1表