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.存储引擎的选择如果数据表需要事务处理,应该考虑使用InnoDB , 因为它完全符合ACID特性 。如果不需要事务处理,使用默认存储引擎MyISAM是比较明智的 。并且不要尝试同时使用这两个存储引擎 。思考一下:在一个事务处理中,一些数据表使用InnoDB , 而其余的使用MyISAM.结果呢?整个subject将被取消,只有那些在事务处理中的被带回到原始状态,其余的被提交的数据转存,这将导致整个数据库的冲突 。然而存在一个简单的方法可以同时利用两个存储引擎的优势 。目前大多数MySQL套件中包括InnoDB、编译器和链表 , 但如果你选择MyISAM,你仍然可以单独下载InnoDB,并把它作为一个插件 。很简单的方法,不是吗?
2.计数问题如果数据表采用的存储引擎支持事务处理(如InnoDB) , 你就不应使用COUNT(*)计算数据表中的行数 。这是因为在产品类数据库使用COUNT(*) , 最多返回一个近似值 , 因为在某个特定时间,总有一些事务处理正在运行 。如果使用COUNT(*)显然会产生bug,出现这种错误结果 。
3.反复测试查询查询最棘手的问题并不是无论怎样小心总会出现错误,并导致bug出现 。恰恰相反,问题是在大多数情况下bug出现时 , 应用程序或数据库已经上线 。的确不存在针对该问题切实可行的解决方法,除非将测试样本在应用程序或数据库上运行 。任何数据库查询只有经过上千个记录的大量样本测试,才能被认可 。

推荐阅读