Mysql优化概述

来自泡泡学习笔记
BrainBs讨论 | 贡献2023年7月7日 (五) 08:17的版本 (创建页面,内容为“数据库性能取决于几个因素,如表、查询和配置设置等数据库级别的软件构造。这些软件构造会导致硬件级别上的CPU和I/O操作,您需要将其最小化并尽可能地提高效率。在处理数据库性能时,首先要学习软件方面的高级规则和指南,并使用墙钟时间进行性能测量。随着您变得更加熟练,您会了解内部发生的更多情况,并开始测量诸如CPU周期和I/O操作等…”)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航 跳到搜索

数据库性能取决于几个因素,如表、查询和配置设置等数据库级别的软件构造。这些软件构造会导致硬件级别上的CPU和I/O操作,您需要将其最小化并尽可能地提高效率。在处理数据库性能时,首先要学习软件方面的高级规则和指南,并使用墙钟时间进行性能测量。随着您变得更加熟练,您会了解内部发生的更多情况,并开始测量诸如CPU周期和I/O操作等内容。


典型用户的目标是在现有的软件和硬件配置中获得最佳的数据库性能。高级用户则寻求改进MySQL软件本身的机会,或者开发自己的存储引擎和硬件设备来扩展MySQL生态系统。


在数据库级别进行优化

使数据库应用程序快速的最重要因素是其基本设计:


  • 表是否适当地结构化?特别是,列是否具有正确的数据类型,每个表是否具有适用于该类型工作的适当列?例如,频繁执行更新的应用程序通常有许多具有少量列的表,而分析大量数据的应用程序通常有少量具有许多列的表。


  • 是否放置了正确的索引以使查询高效?


  • 对于每个表,您是否使用了适当的存储引擎,并发挥了每个存储引擎的优势和功能?特别是,默认情况下使用事务性存储引擎(如InnoDB)还是非事务性存储引擎(如MyISAM)的选择对于性能和可扩展性非常重要。
注意
InnoDB是新表的默认存储引擎。实践中,先进的InnoDB性能特性意味着InnoDB表通常在繁忙的数据库中表现优于简单的MyISAM表。


  • 每个表是否使用适当的行格式?此选择还取决于用于该表的存储引擎。特别是,压缩表使用较少的磁盘空间,因此读取和写入数据所需的磁盘I/O较少。对于所有类型的工作负载,InnoDB表都可以进行压缩,只读的MyISAM表也可以进行压缩。


  • 应用程序是否使用了适当的锁策略?例如,在可能的情况下允许共享访问,以便数据库操作可以并发运行,并在适当时请求独占访问,以确保关键操作具有最高优先级。此外,选择适当的存储引擎非常重要。InnoDB存储引擎能够处理大多数锁定问题,减少了您的干预,从而提供更好的并发性和减少了代码的实验和调优的工作量。


  • 所有用于缓存的内存区域是否都大小正确?即足够大以容纳频繁访问的数据,但不至于超载物理内存并导致分页。需要配置的主要内存区域是InnoDB缓冲池和MyISAM键缓存。


在硬件级别进行优化

任何数据库应用程序在数据库变得越来越繁忙时最终都会遇到硬件限制。数据库管理员必须评估是否有可能调整应用程序或重新配置服务器以避免这些瓶颈,或者是否需要更多的硬件资源。系统瓶颈通常出现在以下几个方面:


  • 磁盘查找。寻找数据需要时间。对于现代磁盘来说,平均时间通常低于10毫秒,因此理论上我们每秒可以进行约100次查找。这个时间随着新磁盘的推出而慢慢改善,很难对单个表进行优化。优化查找时间的方法是将数据分布在多个磁盘上。


  • 磁盘读写。当磁盘处于正确位置时,我们需要读取或写入数据。使用现代磁盘,一个磁盘至少可以提供10-20MB/s的吞吐量。与查找不同,这更容易进行优化,因为您可以从多个磁盘并行读取。


  • CPU周期。当数据在主内存中时,我们必须处理它以获得结果。相对于可用的内存量,具有大型表是最常见的限制因素。但是对于小型表来说,速度通常不是问题。


  • 内存带宽。当CPU需要的数据超过CPU缓存的容量时,主内存带宽就成为瓶颈。对于大多数系统来说,这种瓶颈并不常见,但也需要注意。


平衡可移植性和性能

为了在可移植的MySQL程序中使用面向性能的SQL扩展,可以在语句中使用 /*! */ 注释定界符将特定于MySQL的关键字包裹起来。其他SQL服务器会忽略注释的关键字。