日期:2014-05-16  浏览次数:20744 次

[mysql-manual-5.5]7.1 优化概览

translator: selfimpr

blog: http://blog.csdn.net/lgg201

mail: lgg860911@yahoo.com.cn


优化

优化是一个复杂的任务, 因为它的目的是整个系统被优化. 虽然你可以利用对你的系统或应用的一些认知做一些局部的优化, 但如果你想要更多的优化, 你就需要了解更多的知识.

本章解释一些优化Mysql的不同方式, 并提供示例.记住, 无论如何, 总会有其他方式让系统变得更快, 不过要达到这个目的需要更多的努力.

优化概要

让一个系统更快最重要的因素是它的基础设计. 你必须知道你的系统进行了怎样的处理, 以及它的瓶颈在哪里. 大多数情况下, 系统的瓶颈在以下几个方面:

  • 磁盘寻道: 磁盘查找一块数据需要时间. 对于现代的磁盘, 这方面的平均时间消耗通常小于10ms, 因此理论上说每秒可以寻道100次. 这种情况下新的磁盘的提升已经很缓慢, 并且对单表优化非常困难. 优化寻道时间的方法就是将数据放到多个磁盘上.
  • 磁盘读写: 当磁盘在正确的位置时, 我们需要读取数据. 对于现代的磁盘, 吞吐量至少在10-20MB/s. 这一点相比于寻道很容易优化, 因为你可以从多个磁盘并行读取.
  • CPU周期: 当我们在主存中有数据时, 我们需要处理它得到结果. 表相比于内存较小是最常见的限制因素. 但是对于小表, 速度通常不是问题.
  • 内存带宽: 当CPU需要的数据多余CPU缓存时, 主存的带宽就成为瓶颈. 这对于多数系统而言并不时常见的瓶颈, 但还是要知道它.

Mysql设计限制和折衷

当使用myisam存储引擎时, mysql使用了非常快速的表锁, 允许多个读者或一个写者. 这个存储引擎最大的问题发生在当你有一个稳定的在同一张表上混合更新和慢的查询操作流时. 如果某个表存在这个问题, 你可以选用其他存储引擎.

mysql同时支持事务表和非事务表. 为了让非事务表可以更容易平稳的工作(发生错误不能回滚), mysql有下面的规则. 注意这些规则仅适用于: a) 运行在非严格SQL模式; b) 未INSERT或UPDATE使用了IGNORE说明符

  • 所有的列都有默认值
  • 如果你向一列插入一个超出范围的值, mysql会将该列设置为最合理的值而不是报告错误. 对于数值, 它将是0, 最小可能值或最大可能值. 对于字符串, 则是空字符串或最大能够存入的字符串.
  • 所有的表达式都将返回一个可用的值, 而不是报告错误条件. 比如1/0返回NULL

要改变预定义行为, 你可以通过设置服务端的SQL模式启用严格数据处理.

为可移植性设计应用

因为所有的SQL服务都实现了标准SQL的不同部分, 因此编写可移植的数据库应用需要下一些功夫. 对于简单的select和insert, 很容易得到可移植性, 但是当你需要更多的能力时就会变得更加复杂. 如果你希望你的应用对于多数数据库系统都很快速, 那就更加困难了.

所有的数据库系统都有一些弱点. 也就是说它们采用了不同的折衷设计导致了不同的行为.

要使得复杂的应用可移植, 你需要确定它必须在哪些SQL服务器上工作, 接着确定那些服务器支持的特性. 你可以使用mysql的crash-me程序找出能用于数据库服务器选择的函数, 类型和限制. crash-me不会检查每个可能的特性, 但它涵盖的范围