首页 > 代码库 > MYSQL性能优化分享(分库分表)
MYSQL性能优化分享(分库分表)
MYSQL性能优化之分库分表与不停机修改mysql表结构,需要的朋友可以参考下
1、分库分表
很明显,一个主表(也就是很重要的表,例如用户表)无限制的增长势必严重影响性能,分库与分表是一个很不错的解决途径,也就是性能优化途径,现在的案例是我们有一个1000多万条记录的用户表company,查询起来非常之慢,同事的做法是将其散列到100个表中,分别从company0到company99,然后根据id分发记录到这些表中,牛逼的代码大概是这样子:
<?php
for($i=0;$i< 100; $i++ ){
echo "CREATE TABLE db2.company{$i} LIKE db1.company;\n";
#echo "INSERT INTO company{$i} SELECT * FROM company WHERE id%100={$i};\n";
}
2、不停机修改mysql表结构
同样还是company表,前期设计的表结构不尽合理,随着数据库不断运行,其冗余数据也是增长巨大,同事使用了下面的方法来处理:
先创建一个临时表:
/*创建临时表*/
CREATE TABLE company_tmp LIKE company
然后修改company_tmp的表结构为新结构,接着使用上面那个for循环来导出数据,因为1000万的数据一次性导出是不对的,id是主键,一个区间一个区间的导,基本是一次导出5万条吧,这里略去了
接着重命名将新表替换上去:
RENAME TABLE company TO company_bak,company_tmp TO company;
就是这样,基本可以做到无损失,无需停机更新表结构,但实际上RENAME期间表是被锁死的,所以选择在线少的时候操作是一个技巧。
很明显,一个主表(也就是很重要的表,例如用户表)无限制的增长势必严重影响性能,分库与分表是一个很不错的解决途径,也就是性能优化途径,现在的案例是我们有一个1000多万条记录的用户表company,查询起来非常之慢,同事的做法是将其散列到100个表中,分别从company0到company99,然后根据id分发记录到这些表中,牛逼的代码大概是这样子:
复制代码代码如下:
<?php
for($i=0;$i< 100; $i++ ){
echo "CREATE TABLE db2.company{$i} LIKE db1.company;\n";
#echo "INSERT INTO company{$i} SELECT * FROM company WHERE id%100={$i};\n";
}
2、不停机修改mysql表结构
同样还是company表,前期设计的表结构不尽合理,随着数据库不断运行,其冗余数据也是增长巨大,同事使用了下面的方法来处理:
先创建一个临时表:
/*创建临时表*/
CREATE TABLE company_tmp LIKE company
然后修改company_tmp的表结构为新结构,接着使用上面那个for循环来导出数据,因为1000万的数据一次性导出是不对的,id是主键,一个区间一个区间的导,基本是一次导出5万条吧,这里略去了
接着重命名将新表替换上去:
RENAME TABLE company TO company_bak,company_tmp TO company;
就是这样,基本可以做到无损失,无需停机更新表结构,但实际上RENAME期间表是被锁死的,所以选择在线少的时候操作是一个技巧。
MYSQL性能优化分享(分库分表)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。