数据库性能取决于几个数据库层面的因素,比如:表设计,查询语句,配置。 这些软件结构导致你必须在CPU和I/O 操作的硬件层面做到尽可能的最小化和高效!当你关注于数据库性能时,你需要了解软件层面更高层次的规则和指导建议,并使用wall-clock去测试性能。 而当你成为一个专家时,你更多需要了解的是内部到底发生了什么,并且测试一些东西,包括:CPU和I / O 操作。
一般用户希望通过配置已有的软件和硬件去获取最好的数据库性能,高级用户则寻找机会去提升MySQL软件本身的性能,或者开发出她们自己的存储引擎和硬件程序去扩展MYSQL的生态系统。
一、基于数据库级别的优化
一个可以让数据库程序变得更快的重要因素,是他的基础设计:
1,表结构是否合适???特别是,每一个数据列,是否拥有正确的数据类型???每一个工作表,是否拥有正确的数据列???举个例子:在一个频繁执行更新操作的程序中,通常拥有很多数据列比较少的表单,而需要大数据分析的程序,通常拥有少量的具有很多数据列的表单!
2,是否拥有正确的索引,使得查询更加高效???
3,是否为每个表使用了正确的存储引擎???是否使用了当前应用引擎的最高效最优化的功能???比如:选择一个支持事务的存储引擎(InnoDB)和一个不支持事务的存储引擎(MyISAM),将会对性能和可扩展性带来重要的影响!
备注:InnoDB是每一个新建表单的默认存储引擎。在实践中,InnoDB的高级性能特征意味着InnoDB的表单往往要优于简单的MyISAM表单,尤其是对于操作比较频繁的数据库。
4,是否每个表使用适当的行格式???这个取决于表的存储引擎。特别地,压缩表使用较少的磁盘空间,因此需要较少的磁盘I / O来读取和写入数据。压缩适用于所有InnoDB引擎的工作表,和只读的MyISAM表。
5,应用程序是否使用正确的锁策略???例如:通过允许共享访问,使得数据库操作可以并行执行。而且,请求的合理优先访问,使得操作可以获得最高优先级! 再次声明,对于存储引擎的选择是非常重要的。InnoDB数据库引擎可以在不需要你手动操作的情况下处理绝大部分的有关于锁的问题,支持更好的并发操作,并且减少你调整代码的实验次数!
6,对于缓存的内存配置是否正确???这是说,是否足够大去支持频繁的数据访问,但并不是大到超出物理空间并产生分页。主要的内存区域被配置到InnoDB的缓冲池,MyISAM的主键缓存,和Mysql的查询缓存!
二、基于硬件级别的优化
当数据库操作访问变得越来越频繁的时候,任何数据库的性能都受限于硬件设施。 一个DBA必须评估是否可以通过调整应用程序或者配置去规避这些瓶颈,或者是否需要更多的硬件资源。 典型的系统瓶颈通常有以下情况:
1,磁盘寻找。他花费时间在磁盘上去找到一条数据。在现代化的磁盘中,这个时间通常意味着慢于10ms。所以,在理论上,我们可以在1秒钟内进行100次寻找。对于一个单表的优化来说,通过用新的磁盘去提升这个寻找时间,是非常缓慢,并且非常困难的。去对此进行优化的方式是:分发这些数据到更多的磁盘!
2,磁盘读写。当磁盘处于正确的位置,我们需要读写数据。对于现代化的磁盘来说,一个磁盘至少能支持每秒10-20MB的吞吐量。优化此类状况比磁盘寻找更容易,因为你可以从多个磁盘中并行读取!
3,CPU周期。当数据在主内存中时,我们必须处理它才能得到结果。拥有较大的表与内存量的平衡是最常见的限制因素。但通过使用较小的表单,速度通常不是问题!
4,内存带宽。当CPU需要容纳更多的数据(更多是相对于CPU缓存),主内存带宽成为了一个瓶颈。对于大多数系统来说,这虽然并不是一个常见的瓶颈,但也是一个需要注意的点。
三、性能和简单便携的平衡
在一个便携式的Mysql程序中,应用高性能的SQL扩展语句:在一个语句块中使用/*! */,注释Mysql特定的关键字。其他的SQL服务器,忽略被注释的关键字!