所谓知己知彼,百战不殆。既然要优化数据库,我们就首先要知道,优化的是什么,或者说:什么因素影响了数据库的性能。
影响数据库因素主要因素总结如下:
以上因素并不是时时刻刻都会影响我们的数据库性能,而就像木桶效应一样:如果其中一个因素严重影响性能,那么整个数据库性能就会严重受阻。另外,这些影响因素都是相对的,例如:当数据量并没有达到百万千万这样的级别,那么sql查询速度也许就不是个重要因素,换句话说,你的sql语句效率适当低下可能并不影响整个效率多少,反之,这种情况,无论如何怎么优化sql语句,可能都没有太明显的效果。
因此,知道哪些影响因素会直接导致哪些现象产生,是至关重要的经验,就像福尔摩斯一样,通过现象看本质。接下来我们对不同的现象与影响因素做一一对应的总结。
什么是QPS:每秒钟查询量。如果每秒钟能处理100条查询sql语句,那么QPS就约等于100
什么是TPS:每秒钟事务处理的数量。
在大促的情况下,访问量暴增。这种情况下,sql语句的优化显得最直接最有效。由于现在的mysql不支持多cpu并发运算,即每条sql只能由一条cpu执行。这也就意味着,如果我们想提高单挑sql的执行速度,无法通过增加cpu的方式达到效果。
对于数据库而言,所能建立的连接数是有限的,mysql中max_connections参数默认值是100。
使用更好的磁盘设备解决。
调整计划任务
如何避免无法连接数据库的情况:
什么样的表可以称为大表
很难在一定的时间内过滤出所需要的数据
风险:MySQL版本<5.5建立索引会锁表,>=5.5虽然不会锁表但会引起主从延迟。
风险:会造成长时间的主从延迟;影响正常的数据操作
难点:
分库分表需要消耗大量的人力物力,而且要冒着影响业务的风险,所以要慎重。
大表的历史数据归档,可以减少对前后端业务的影响。
难点:
事务是一组具有原子性的SQL语句
事务特性:原子性,一致性,隔离性,持久性
一个事务必须被视为一个不可分割的最小工作单元。整个事务要么全部提交成功,要么全部失败。
例如:银行转账,我向你汇钱,要么成功,我的账户减少1000元,你的账户增加1000元。要么失败,我不减,你也没有增加。不能出现:我的账户减少1000,这时候断电了,你没收到。
事务将数据库从一种一致性状态转换到另一种一致性状态,在事务开始之前和事务结束之后数据库中的数据的完整性没有被破坏
例如:银行转账,转来转去,总和应该保持不变。在我看开,一致性其实就是宏观上强调了一下原子性。只要原子性原则没有被破坏,应该就总是一致的。
一个事务对数据库中的数据进行修改,在未提交完成前对其他事务是否可见的。隔离性有四种级别:
未提交读(READ UNCOMMITED)
已提交读(READ COMMITED)
可重复读(REPEATABLE READ)
串行化(SERIALIZABLE)
例如:银行转账。比如你答应给你女朋友转1000块钱给她买粉。
一旦事务提交,则其所做的修改就会永久保存到数据库中。
运行时间比较长,操作数据比较多的事务
原文:http://blog.csdn.net/u011118321/article/details/54692454