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


b,网上看到一些说replace不起作用 , 我试了一下可以起作用的 。晕一个先
mysql UPDATE alluser SET sex=REPLACE(sex, 0, 1) where id=2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1Changed: 1Warnings: 0
mysql select * from alluser;
+----+--------+-----+
| id | name| sex |
+----+--------+-----+
|1 | 张映 |0 |
|1 | tank|1 |
|2 | tank2|1 |
+----+--------+-----+
3 rows in set (0.00 sec)
c,一个 merge 表不能在整个表上维持 unique 约束 。当你执行一个 insert,数据进入第一个或者最后一个 myisam 表(取决于 insert_method 选项的值) 。mysql 确保唯一键值在那个 myisam 表里保持唯一,但不是跨集合里所有的表 。
d,当你创建一个 merge 表之时,没有检查去确保底层表的存在以及有相同的机构 。当 merge 表被使用之时 , mysql 检查每个被映射的表的记录长度是否相等,但这并不十分可靠 。如果你从不相似的 myisam 表创建一个 merge 表,你非常有可能撞见奇怪的问题 。
优点:扩展性好,并且程序代码改动的不是很大
缺点:这种方法的效果比第二种要差一点
三,总结一下
上面提到的三种方法 , 我实际做过二种,第一种和第二种 。第三种没有做过,所以说的细一点 。哈哈 。做什么事都有一个度 , 超过个度就过变得很差,不能一味的做数据库服务器集群,硬件是要花钱买的,也不要一味的分表 , 分出来1000表,mysql的存储归根到底还以文件的形势存在硬盘上面,一张表对应三个文件,1000个分表就是对应3000个文件,这样检索起来也会变的很慢 。我的建议是
方法1和方法2结合的方式来进行分表
方法1和方法3结合的方式来进行分表
我的二个建议适合不同的情况,根据个人情况而定,我觉得会有很多人选择方法1和方法3结合的方式
二,mysql分表和分区有什么区别呢
1,实现方式上
a),mysql的分表是真正的分表,一张表分成很多表后,每一个小表都是完正的一张表 , 都对应三个文件,一个.MYD数据文件 , .MYI索引文件,.frm表结构文件 。
[root@BlackGhost test]# ls |grep user
alluser.MRG
alluser.frm
user1.MYD
user1.MYI
user1.frm
user2.MYD
user2.MYI
user2.frm
Php代码
[root@BlackGhost test]# ls |grep user
alluser.MRG
alluser.frm
user1.MYD
user1.MYI
user1.frm
user2.MYD
user2.MYI
user2.frm
简单说明一下,上面的分表呢是利用了merge存储引擎(分表的一种),alluser是总表,下面有二个分表,user1,user2 。他们二个都是独立的表 , 取数据的时候 , 我们可以通过总表来取 。这里总表是没有.MYD,.MYI这二个文件的,也就是说,总表他不是一张表,没有数据,数据都放在分表里面 。我们来看看.MRG到底是什么东西
[root@BlackGhost test]# cat alluser.MRG |more
user1
user2
#INSERT_METHOD=LAST
Php代码
[root@BlackGhost test]# cat alluser.MRG |more
user1
user2
#INSERT_METHOD=LAST
从上面我们可以看出,alluser.MRG里面就存了一些分表的关系,以及插入数据的方式 。可以把总表理解成一个外壳,或者是联接池 。
b),分区不一样,一张大表进行分区后,他还是一张表,不会变成二张表,但是他存放数据的区块变多了 。
[root@BlackGhost test]# ls |grep aa
aa#P#p1.MYD
aa#P#p1.MYI
aa#P#p3.MYD
aa#P#p3.MYI
aa.frm
aa.par
Php代码
[root@BlackGhost test]# ls |grep aa
aa#P#p1.MYD
aa#P#p1.MYI
aa#P#p3.MYD

推荐阅读