数据库性能取决于数据库级的表、查询和配置设置等因素。这些软件结构会导致硬件级别的 CPU 和 I/O 操作,本文学习通过那些方式能够使其最小化并尽可能提高效率。
使数据库应用程序快速运行的最重要因素是其基本设计:
表的结构是否正确?特别是,每个表的字段是否具有适合类型?
例如,执行频繁更新的应用程序通常有很多表和很少的列,而分析大量数据的应用程序通常有很少的表和很多列。
是否有正确的 索引来提高查询效率?
是否为每个表使用了适当的存储引擎,并利用了每个存储引擎的优势和特性?特别是,选择事务性存储引擎(例如事务性存储引擎) InnoDB 或非事务性存储引擎(例如)MyISAM 对于性能和可伸缩性可能非常重要。
每个表是否使用适当的行格式?此选择还取决于用于表的存储引擎。特别是,压缩表使用更少的磁盘空间,因此需要更少的磁盘 I/O
来读取和写入数据。压缩适用于所有类型的带有 InnoDB表的工作负载,也适用于只读 MyISAM表。
应用程序是否使用了适当的 锁定策略(锁定策略包括悲观、乐观和无。
)?例如,尽可能允许共享访问,以便数据库操作可以并发运行,并在适当时请求独占访问,以便关键操作获得最高优先级。同样,存储引擎的选择很重要。存储引擎无需您参与即可处理大多数锁定问题,从而提高数据库的InnoDB并发性并减少代码的试验和调整量。
用于缓存的所有内存区域的大小是否正确?也就是说,大到足以容纳经常访问的数据,但又不会大到使物理内存过载并导致分页。要配置的主要内存区域是InnoDB缓冲池、MyISAM键缓存和MySQL 查询缓存。
随着数据库变得越来越繁忙,任何数据库应用程序最终都会遇到硬件限制。DBA 必须评估是否可以调整应用程序或重新配置服务器以避免这些 瓶颈,或者是否需要更多的硬件资源。系统瓶颈通常来自以下来源:
磁盘寻道。磁盘找到一条数据需要时间。对于现代磁盘,平均时间通常低于 10 毫秒,因此理论上我们每秒可以进行大约 100次寻道。这个时间随着新磁盘的增加而缓慢改善,并且很难针对单个表进行优化。优化寻道时间的方法是将数据分布到多个磁盘上。
磁盘读写。当磁盘在正确的位置时,我们需要读取或写入数据。使用现代磁盘,一个磁盘可提供至少 10–20MB/s的吞吐量。这比查找更容易优化,因为可以从多个磁盘并行读取。
CPU周期。当数据在主存中时,我们必须对其进行处理以获得我们的结果。与内存相比,大表是最常见的限制因素。
内存带宽。当 CPU 需要的数据超出 CPU高速缓存的容量时,主内存带宽就会成为瓶颈。对于大多数系统来说,这是一个不常见的瓶颈,但需要注意。
要在可移植的 MySQL 程序中使用面向性能的 SQL 扩展,您可以将 MySQL 特定的关键字包装在/*! */注释分隔符内的语句中。其他SQL 服务器忽略注释的关键字。
MySQL Server 支持三种注释样式:
- #字符到行尾。
- – 序列到行尾。在 MySQL 中,-- (双破折号)注释样式要求第二个破折号后跟至少一个空格或控制字符(例如空格、制表符、换行符等)。
- /*序列到下面的 */序列,就像在 C 编程语言中一样。此语法使注释可以扩展到多行,因为开始和结束序列不必在同一行。
以下示例演示了所有三种注释样式:
mysql> SELECT 1+1; # This comment continues to the end of line
mysql> SELECT 1+1; -- This comment continues to the end of line
mysql> SELECT 1 /* this is an in-line comment */ + 1;
mysql> SELECT 1+
/*
this is a
multiple-line comment
*/
1;
点赞 收藏 关注