在软件方面,数据库性能取决于很多因素,比如表设计,查询语句以及数据库配置等。在硬件方面,则主要取决于CPU和IO操作。作为一名软件开发者,需要我们从现有的软硬件配置中获得最佳的数据库性能,为了达到这一目的,需要先了解在软硬件方面,具体从哪些方面入手优化数据库性能。
使数据库应用程序快速运行的最重要因素是其基本设计:
数据库设计中有以下几个重要的点:
表设计是否合理?尤其是,列的数据类型是否是合适的,每个表结构设计是否合理。比如,频繁更新的表更倾向于设计有更少列的多个表,大数据量分析的应用需要的是列比较多的少数几个表。
是否合理的使用了可以提高查询性能的索引。
是否适当的使用了存储引擎,并利用了每个存储引擎的优势和特性,尤其是,选择事务性存储引擎(如InnoDB)或非事务性存储引擎(如MyISAM)对于性能和可扩展性非常重要。
表中的每个列是否使用了恰当的数据类型。这还却决于表所使用的存储引擎,尤其是,压缩表使用更少的空间可以使读取和写入的磁盘IO更少。
应用程序是否使用了适当的锁定策略?例如,尽可能允许共享访问,以便数据库操作可以并发运行,并在适当时请求独占访问,以便关键操作获得最高优先级。同样,存储引擎的选择很重要。InnoDB存储引擎可以在不需要您参与的情况下处理大多数锁定问题,从而提高数据库的并发性,减少代码的实验和调整量。
用于缓存的所有内存区域的大小是否正确?也就是说,足够大以容纳频繁访问的数据,但不至于太大而导致物理内存过载并导致分页。要配置的主要内存区域是InnoDB缓冲池和MyISAM密钥缓存。
随着数据库变得越来越繁忙,任何数据库应用程序最终都会遇到硬件限制。DBA必须评估是否有可能调整应用程序或重新配置服务器以避免这些瓶颈,或者是否需要更多的硬件资源。系统瓶颈通常来自以下来源:
磁盘寻道。磁盘查找数据需要时间。对于现代磁盘来说,平均寻道时间通常低于10毫秒,因此理论上我们可以每秒进行大约100次寻道。这个时间随着新磁盘的推出而缓慢改善,但对于单个表来说非常难以优化。优化寻道时间的方法是将数据分布在多个磁盘上。
磁盘读写。当磁盘位于正确位置时,我们需要读取或写入数据。对于现代磁盘,一个磁盘的吞吐量至少为10-20MB/s。这比寻道更容易优化,因为你可以从多个磁盘并行读取数据。
CPU周期。当数据在主内存中时,我们必须处理它以得到结果。与内存容量相比,大型表是最常见的限制因素。但对于小型表来说,速度通常不是问题。
内存带宽。当CPU需要的数据超过CPU缓存容量时,主内存带宽成为瓶颈。对于大多数系统来说,这是一个不常见的瓶颈,但需要注意。