mysql集群分表怎么分 mysql集群架构部署方案( 三 )


数据存放的数据库=分库字段的内容%数据库的数量
**3、即分表又分库**
数据库分表可以解决单表海量数据的查询性能问题 , 分库可以解决单台数据库的并发访问压力问题 。
当数据库同时面临海量数据存储和高并发访问的时候,需要同时采取分表和分库策略 。一般分表分库策略如下:
中间变量 = 关键字%(数据库数量*单库数据表数量)
库 = 取整(中间变量/单库数据表数量)
表 = (中间变量%单库数据表数量)
实例:
1、分库分表
很明显,一个主表(也就是很重要的表,例如用户表)无限制的增长势必严重影响性能,分库与分表是一个很不错的解决途径,也就是性能优化途径,现在的案例是我们有一个1000多万条记录的用户表members,查询起来非常之慢,同事的做法是将其散列到100个表中,分别从members0到members99,然后根据mid分发记录到这些表中,牛逼的代码大概是这样子:
复制代码 代码如下:
?php
for($i=0;$i 100; $i++ ){
//echo "CREATE TABLE db2.members{$i} LIKE db1.members
";
echo "INSERT INTO members{$i} SELECT * FROM members WHERE mid%100={$i}
";
}
?
2、不停机修改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多 。
mysql水平分表的几种方法1.按时间分表
这种分表方式有一定mysql集群分表怎么分的局限性mysql集群分表怎么分,当数据有较强的实效性mysql集群分表怎么分 , 如微博发送记录、微信消息记录等,这种数据很少有用户会查询几个月前的数据,如就可以按月分表 。
2.按区间范围分表
一般在有严格的自增id需求上 , 如按照user_id水平分表mysql集群分表怎么分:
table_1user_id从1~100w
table_2user_id从101~200w
table_3user_id从201~300w
...
3.hash分表
通过一个原始目标的ID或者名称通过一定的hash算法计算出数据存储表的表名 , 然后访问相应的表 。
按如下分10张表mysql集群分表怎么分:
function get_hash_table($table, $userid)
{
$str = crc32($userid);
if ($str0) {
$hash = "0" . substr(abs($str), 0, 1);
} else {
$hash = substr($str, 0, 2);
}
return $table . "_" . $hash;
}
echo get_hash_table('message', 'user18991'); //结果为message_10
echo get_hash_table('message', 'user34523'); //结果为message_13
mysql集群分表怎么分的介绍就聊到这里吧 , 感谢你花时间阅读本站内容,更多关于mysql集群架构部署方案、mysql集群分表怎么分的信息别忘了在本站进行查找喔 。

推荐阅读