mysql数据库分表查询_mysql数据库分表及实现
项⽬开发中,我们的数据库数据越来越⼤,随之⽽来的是单个表中数据太多。以⾄于查询书读变慢,⽽且由于表的锁机制导致应⽤操作也搜到严重影响,出现了数据库性能瓶颈。
当出现这种情况时,我们可以考虑分表,即将单个数据库表进⾏拆分,拆分成多个数据表,然后⽤户访问的时候,根据⼀定的算法,让⽤户访问不同的表,这样数据分散到多个数据表中,减少了单个数据表的访问压⼒。提升了数据库访问性能。
我们可以进⾏简单的设想:现在有⼀个表products存储产品信息,现在有100万⽤户在线访问,就要进⾏⾄少100万次请求,现在我们如果将它分成100个表即products0~~products99,那么利⽤⼀定的算法我们就分担了单个表的访问压⼒,每个表只有1万个请求(当然,这是理想情况下!)dishwasher
实现mysql 分表的关键在于:设计良好的算法来确定"什么时候情况下访问什么(哪个)表"。
下⾯我们先来实现⼀个简单的mysql分表演⽰:这⾥使⽤MERGE分表法
1,创建⼀个完整表存储着所有的成员信息
create table member(
id bigint auto_increment primary key,
name varchar(20),
sex tinyint not null default '0'
)engine=myisam default charset=utf8 auto_increment=1;
加⼊点数据:
insert into member(id,name,sex) values (1,'jacson','0');
insert into member(name,sex) select name,sex from member;
第⼆条语句多执⾏⼏次就有了很多数据。
2,下⾯我们进⾏分表:这⾥我们分两个表tb_member1,tb_member2
DROP table IF EXISTS tb_member1;
create table tb_member1(
id bigint primary key auto_increment ,
name varchar(20),
sex tinyint not null default '0'
jdk最新版本是多少)ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
DROP table IF EXISTS tb_member2;
create table tb_member2(
id bigint primary key auto_increment ,
name varchar(20),
sex tinyint not null default '0'
)ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
//创建tb_member2也可以⽤下⾯的语句 create table tb_member2 like tb_member1;
3,创建主表tb_member
DROP table IF EXISTS tb_member;
create table tb_member(
id bigint primary key auto_increment ,
name varchar(20),
sex tinyint not null default '0'
)ENGINE=MERGE UNION=(tb_member1,tb_member2) INSERT_METHOD=LAST CHARSET=utf8 AUTO_INCREMENT=1 ;查看⼀下tb_member表的结构:desc tb_member;
常量矿物质元素4,接下来,我们把数据分到两个分表中去:
insert into tb_member1(id,name,sex) select id,name,sex from member where id%2=0;
insert into tb_member2(id,name,sex) select id,name,sex from member where id%2=1;
查看⼀下主表的数据:select * from tb_member;
注意:总表只是⼀个外壳,存取数据发⽣在⼀个⼀个的分表⾥⾯。
ps:创建主表时可能会出现下⾯的错误:
ERROR 1168 (HY000): Unable to open underlying table which is differently defined
or of non-MyISAM type or doesn't exist
若遇到上⾯这种错误,⼀般从两⽅⾯来排查:(从这两⽅⾯⼀般可以解决这个问题,本⼈也遇到了。)
1,查看上⾯的分表数据库引擎是不是MyISAM.
2,查看分表与指标的字段定义是否⼀致。
define是什么函数分表的⼤概过程和步骤就是这样的,下⾯我们来看看分表的算法实现:
假设现在有⼀个应⽤系统可能会有100亿的⽤户量,另外⼀个表⼀般存储量在不超过100万的时候基本能保持良好性能,计算下来,我们需要1万张表,即分表为1万个表。
mysql语句多表查询我们可以设计成:user_0~user_9999
在⽤户表⾥⾯我们有唯⼀的标⽰是⽤户id,我们尅设计⼀个⼩算法来实现⽤户id与访问表名的对应:
function getTable($id)
{
return 'user_'.sprintf('%d',($id >>20));
}
解释⼀下:($id >> 20)表⽰将向右移位20位,(向右移动⼀位标⽰减少⼀半),printf('%d',$data)标⽰将数据按照⼗进制输出。
即id为1~1048575(2的20次幂-1)时均访问user_0,1048576~2097152时访问user_1,以此类推.....
那么问题来了,如果⽤户更多怎么办,现在需要⼀个可扩展的⽅法:
osi七层模型网络层
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论