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分区之list分区需要指定的每个分区数据的存储条件 。分区的字段一定要是主键!按照生日中的月份,分成春夏秋冬四个分区 。
下面新建一个list_1表,
分区创建成功之后,查看文件信息
注意:chun和dong两个分区,分别放入了数据.这就说明我们的分区生效了.
1 list分区就是根据分区条件,将数据分为若干区,也会生成相应的数据文件.
2 这个list()中也可以直接指定字段,但是这个字段一定要是整数.
十、MySQL表分区 ??表分区是将?个表的数据按照?定的规则?平划分为不同的逻辑块,并分别进?物理存储,这个规则就叫做分区函数,可以有不同的分区规则 。5.7可以通过show plugins语句查看当前MySQL是否?持表分区功能 。
??但当表中含有主键或唯?键时 , 则每个被?作分区函数的字段必须是表中唯?键和主键的全部或?部分,否则就?法创建分区表 。?如下?的表由于唯?键和主键没有相同的字段 , 所以?法创建表分区
上述例?中删除唯?键,确保主键中的字段包含分区函数中的所有字段 , 创建成功
或者将主键扩展为包含ref字段
表分区的主要优势在于:
??可以允许在?个表?存储更多的数据,突破磁盘限制或者?件系统限制
??对于从表?将过期或历史的数据移除在表分区很容易实现,只要将对应的分区移除即可
??对某些查询和修改语句来说 , 可以?动将数据范围缩?到?个或?个表分区上,优化语句执?效率 。?且可以通过显示指定表分区来执?语句,?如 SELECT * FROM t PARTITION (p0,p1) WHERE c5

推荐阅读