Mysql分库分表方案

云计算 waitig 556℃ 百度已收录 0评论

1.为什么要分表

当一张表的数据达到几千万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了。分表的目的就在于此,减小数据库的负担,缩短查询时间。
mysql中有一种机制是表锁定和行锁定,是为了保证数据的完整性。表锁定表示你们都不能对这张表进行操作,必须等我对表操作完才行。行锁定也一样,别的sql必须等我对这条数据操作完了,才能对这条数据进行操作。

2.mysql proxy:amoeba

做mysql集群,利用amoeba。
从上层的java程序来讲,不需要知道主服务器和从服务器的来源,即主从数据库服务器对于上层来讲是透明的。可以通过amoeba来配置(负载均衡)

3. 大数据量并且访问频繁的表,将其分为若干个表

比如对于某网站平台的数据库表-公司表,数据量很大,这种能预估出来的大数据量表,我们就事先分出个N个表,这个N是多少,根据实际情况而定。
某网站现在的数据量至多是5000万条,可以设计每张表容纳的数据量是500万条,也就是拆分成10张表,
那么如何判断某张表的数据是否容量已满呢?可以在程序段对于要新增数据的表,在插入前先做统计表记录数量的操作,当<500万条数据,就直接插入,当已经到达阀值,可以在程序段新创建数据库表(或者已经事先创建好),再执行插入操作。

4.利用merge存储引擎来实现分表

如果要把已有的大数据量表分开比较痛苦,最痛苦的事就是改代码,因为程序里面的sql语句已经写好了。用merge存储引擎来实现分表,

create table if not exists`user1`(
`id` int(11) not null auto_increment,
`name` varchar(50) default null,
`sex` int(1) not null default '0',
primary key(`id`)
)engine= Myisam default cahrset=utf8 auto_increment=1;

create table if not exists`user1`(
`id` int(11) not null auto_increment,
`name` varchar(50) default null,
`sex` int(1) not null default '0',
primary key(`id`)
)engine= Myisam default cahrset=utf8 auto_increment=1;


insert into `user1`(`name`,`sex`) values(`u1`,0);

insert into `user2`(`name`,`sex`) values(`u2`,1);

create table if not exists `alluser`(
`id` int(11) not null auto_increment,
`name` varchar(50) default null,
`sex` int(1) not null default '0',
index(id)
)engine=merge union(user1,user2) insert_method=last auto_increment=1;

insert into `alluser`(`name`,`sex`) values(`u3`,1);

select id ,name from `alluser`;

本文由【waitig】发表在等英博客
本文固定链接:Mysql分库分表方案
欢迎关注本站官方公众号,每日都有干货分享!
等英博客官方公众号
点赞 (0)分享 (0)