mysql的分片怎么写 mysql 分区 分片 分库 分表( 三 )


?
说明一下,上面的这个方法,告诉我们user18991这个用户的消息都记录在message_10这张表里,user34523这个用户的消息都记录在message_13这张表里 , 读取的时候,只要从各自的表中读取就行了 。
优点:避免一张表出现几百万条数据,缩短了一条sql的执行时间
缺点:当一种规则确定时,打破这条规则会很麻烦,上面的例子中我用的hash算法是crc32,如果我现在不想用这个算法了,改用md5后 , 会使同一个用户的消息被存储到不同的表中 , 这样数据乱套了 。扩展性很差 。
3,利用merge存储引擎来实现分表
我觉得这种方法比较适合 , 那些没有事先考虑,而已经出现了得,数据查询慢的情况 。这个时候如果要把已有的大数据量表分开比较痛苦 , 最痛苦的事就是改代码 , 因为程序里面的sql语句已经写好了,现在一张表要分成几十张表,甚至上百张表,这样sql语句是不是要重写呢?举个例子 , 我很喜欢举子
mysqlshow engines;的时候你会发现mrg_myisam其实就是merge 。
查看复制打印?
mysql 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=MyISAMDEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Query OK, 0 rows affected (0.05 sec)
mysql CREATE TABLE IF NOT EXISTS `user2` (
-`id` int(11) NOT NULL AUTO_INCREMENT,
-`name` varchar(50) DEFAULT NULL,
-`sex` int(1) NOT NULL DEFAULT '0',
-PRIMARY KEY (`id`)
- ) ENGINE=MyISAMDEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Query OK, 0 rows affected (0.01 sec)
mysql INSERT INTO `user1` (`name`, `sex`) VALUES('张映', 0);
Query OK, 1 row affected (0.00 sec)
mysql INSERT INTO `user2` (`name`, `sex`) VALUES('tank', 1);
Query OK, 1 row affected (0.00 sec)
mysql 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)
- ) TYPE=MERGE UNION=(user1,user2) INSERT_METHOD=LAST AUTO_INCREMENT=1 ;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql select id,name,sex from alluser;
+----+--------+-----+
| id | name| sex |
+----+--------+-----+
|1 | 张映 |0 |
|1 | tank|1 |
+----+--------+-----+
2 rows in set (0.00 sec)
mysql INSERT INTO `alluser` (`name`, `sex`) VALUES('tank2', 0);
Query OK, 1 row affected (0.00 sec)
mysql select id,name,sex from user2
- ;
+----+-------+-----+
| id | name| sex |
+----+-------+-----+
|1 | tank|1 |
|2 | tank2 |0 |
+----+-------+-----+
2 rows in set (0.00 sec)
从上面的操作中,我不知道你有没有发现点什么?假如我有一张用户表user,有50W条数据 , 现在要拆成二张表user1和user2,每张表25W条数据,
INSERT INTO user1(user1.id,user1.name,user1.sex)SELECT (user.id,user.name,user.sex)FROM user where user.id = 250000
INSERT INTO user2(user2.id,user2.name,user2.sex)SELECT (user.id,user.name,user.sex)FROM user where user.id250000
这样我就成功的将一张user表,分成了二个表,这个时候有一个问题,代码中的sql语句怎么办,以前是一张表,现在变成二张表了,代码改动很大,这样给程序员带来了很大的工作量,有没有好的办法解决这一点呢?办法是把以前的user表备份一下,然后删除掉 , 上面的操作中我建立了一个alluser表,只把这个alluser表的表名改成user就行了 。但是 , 不是所有的mysql操作都能用的
a,如果你使用 alter table 来把 merge 表变为其它表类型 , 到底层表的映射就被丢失了 。取而代之的,来自底层 myisam 表的行被复制到已更换的表中,该表随后被指定新类型 。

推荐阅读