数据库性能取决于多个数据库级别的因素,如表、查询和配置设置。这些软件构造在硬件级别上导致CPU和I/O操作,您必须尽量减少和提高这些操作的效率。在优化数据库性能时,您首先学习软件方面的高级规则和指南,并使用墙上时间测量性能。随着您变得更加专业,您将学习更多关于内部发生的事情,并开始测量诸如CPU周期和I/O操作等指标。
典型用户旨在从现有的软件和硬件配置中获得最佳数据库性能。高级用户寻找机会来改进MySQL软件本身,或者开发自己的存储引擎和硬件设备以扩展MySQL生态系统。
使数据库应用程序快速的最重要因素是其基本设计:
-
表结构是否正确?特别是,列是否具有正确的数据类型,每个表是否具有适合工作类型的列?例如,频繁更新的应用程序通常具有多个表和少量列,而分析大量数据的应用程序通常具有少量表和多个列。
-
是否正确地设置了索引以使查询高效?
-
是否使用了适合每个表的存储引擎,并充分利用了每个存储引擎的优势和功能?特别是,选择事务存储引擎,如InnoDB,或非事务存储引擎,如MyISAM,对性能和可扩展性非常重要。
NoteInnoDB
是新表的默认存储引擎。在实践中,高级InnoDB性能功能意味着InnoDB表通常比简单的MyISAM表具有更好的性能,特别是在繁忙的数据库中。 -
每个表是否使用了适合的行格式?这也取决于表使用的存储引擎。特别是,压缩表使用较少的磁盘空间,因此需要较少的磁盘I/O来读取和写入数据。压缩功能适用于所有工作负载的InnoDB表,以及只读MyISAM表。
-
应用程序是否使用了适合的锁定策略?例如,允许共享访问以便数据库操作可以并发运行,并请求独占访问以便关键操作获得最高优先级。再次,存储引擎的选择非常重要。
InnoDB
存储引擎处理大多数锁定问题,而不需要您参与,从而提高了数据库的并发性,并减少了代码的试验和调整。 -
所有缓存内存区域是否正确地配置了大小?即,足够大以容纳频繁访问的数据,但又不至于过载物理内存并导致分页。主要的内存区域需要配置的是InnoDB缓冲池和MyISAM键缓存。
任何数据库应用程序最终都会遇到硬件限制,因为数据库变得越来越繁忙。DBA必须评估是否可以调整应用程序或重新配置服务器以避免这些瓶颈,或者是否需要更多的硬件资源。系统瓶颈通常来自以下来源:
-
磁盘寻道。磁盘需要时间来找到一 piece of 数据。使用现代磁盘,平均时间通常低于10ms,因此我们可以理论上每秒执行大约100次寻道。这个时间随着新磁盘的出现而慢慢改善,并且很难为单个表进行优化。优化寻道时间的方法是将数据分布到多个磁盘上。
-
磁盘读取和写入。当磁盘处于正确位置时,我们需要读取或写入数据。使用现代磁盘,每个磁盘至少可以提供10-20MB/s的吞吐量。这比寻道时间更容易优化,因为您可以从多个磁盘并行读取。
-
CPU 周期。当数据在主内存中时,我们必须处理它以获得结果。与内存量相比,大的表格是最常见的限制因素。但是对于小表格,速度通常不是问题。
-
内存带宽。当 CPU 需要更多数据时,无法容纳在 CPU 缓存中,主内存带宽就会成为瓶颈。这是大多数系统中不常见的瓶颈,但需要注意。
要在可移植的 MySQL 程序中使用性能导向的 SQL 扩展,可以将 MySQL 特定的关键字包装在带有 /*! */
注释分隔符的语句中。其他 SQL 服务器将忽略注释的关键字。有关编写注释的信息,请参阅 第 11.7 节,“注释”。