mysql分表的方法

一、利用merge存储引擎来实现分表

1、创建分表,和主表的表结构相同,这里创建3个表

CREATE TABLE 新表 LIKE 旧表;
CREATE TABLE csdn1 LIKE csdn;

2、复制主表数据到分表

INSERT INTO csdn1 SELECT * FROM csdn LIMIT 50000;
INSERT INTO csdn2 SELECT * FROM csdn LIMIT 50001,50000;
INSERT INTO csdn3 SELECT * FROM csdn LIMIT 100002,50000;
INSERT INTO csdn4 SELECT * FROM csdn LIMIT 150003,50000;
INSERT INTO csdn5 SELECT * FROM csdn LIMIT 200004,50000;
INSERT INTO csdn6 SELECT * FROM csdn LIMIT 250005,50000;

3、创建汇总表csdnall

CREATE TABLE csdnAll LIKE csdn;
ALTER TABLE csdnall  ENGINE=MERGE UNION=(csdn1,csdn2,csdn3,csdn4,csdn5,csdn6) INSERT_METHOD=LAST;

这样插入新的数据会插入的csdn6,最后一个表中

二、利用hash、md5等自己的算法分表

现在的案例是我们有一个1000多万条记录的用户表members,查询起来非常之慢,同事的做法是将其散列到100个表中,分别从members0到members99,然后根据mid分发记录到这些表中,代码大概是这样子:

<?php
for($i=0;$i< 100; $i++ ){
	//echo "CREATE TABLE db2.members{$i} LIKE db1.members<br>";
	echo "INSERT INTO members{$i} SELECT * FROM members WHERE mid%100={$i}<br>";
}
?>

1、不停机修改mysql表结构

同样还是members表,前期设计的表结构不尽合理,随着数据库不断运行,其冗余数据也是增长巨大,使用了下面的方法来处理:

先创建一个临时表:

/*创建临时表*/
CREATE TABLE members_tmp LIKE members
然后修改members_tmp的表结构为新结构,接着使用上面那个for循环来导出数据,因为1000万的数据一次性导出是不对的,mid是主键,一个区间一个区间的导,基本是一次导出5万条吧,这里略去了,接着重命名将新表替换上去:

/*这是个颇为经典的语句哈*/
RENAME TABLE members TO members_bak,members_tmp TO members;
就是这样,基本可以做到无损失,无需停机更新表结构,但实际上RENAME期间表是被锁死的,所以选择在线少的时候操作是一个技巧。经过这个操作,使得原先8G多的表,一下子变成了2G多



评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值