随着负载和文件大小的增长,性能趋于下降。牢记这7个要点,让您的MySQL保持平稳运行很容易。衡量应用程序的方法之一是衡量其性能。用户体验是衡量应用程序性能的指标,即用户是否在合理的时间内获得了他们想要的东西。许多研究表明,性能对用户行为有很大影响:79%的用户表示他们不太可能再次打开速度慢的网站;47%的用户期望网页加载时间少于2秒;40%的用户表示,如果加载时间超过三秒,网站将被放弃;页面加载时间延迟1秒会导致7%的转化损失和11%的页面浏览量减少。无论标准如何,保持良好的应用程序性能势在必行。否则,用户会抱怨(或转到另一个应用程序)。影响应用程序性能的一个主要因素是数据库性能。应用程序、网站和数据库之间的交互对应用程序性能至关重要。这种交互的核心部分是应用程序如何查询数据库以及数据库如何响应请求。无论从哪个方面来说,MySQL都是最著名的数据库管理系统之一。许多企业正在使用MySQL(和其他开源数据库)作为他们的生产数据库解决方案。有许多配置MySQL的方法可以帮助确保您的数据库快速响应查询并减少应用程序性能下降。这里有一些重要的提示,可帮助您优化MySQL数据库的性能。MySQL调优要点1:了解如何使用EXPLAIN对于数据库,您做出的两个最重要的决定是:设计应用程序如何将实体之间的关系映射到表(数据库模式)以所需格式设计应用程序(查询)获取所需的数据。复杂的应用程序可能有复杂的查询和模式。如果您要获得应用程序所需的性能和可伸缩性,需要的不仅仅是可视化查询的执行方式。您应该学习如何使用EXPLAIN命令。此命令向您展示应如何执行查询,并让您深入了解预期的性能以及查询如何随着数据大小的变化而扩展。像MySQLWorkbench这样的工具可以向您显示EXPLAIN输出,但您仍然需要学习基础知识才能理解它。EXPLAIN命令提供两种不同格式的输出:旧式表格格式和更现代的结构化JSON文档,后者提供更多详细信息(如下所示):组件应该感兴趣的“查询成本”。查询成本意味着MySQL会根据许多不同的因素在查询执行的总体成本中考虑该特定查询的成本。简单查询的查询成本通常低于1000。成本在1,000到100,000之间的查询被认为是中等成本查询,如果您每秒只运行几百个查询(而不是数万个),则通常被认为是快速查询.超过100,000的查询被认为是高成本查询。通常,当您是系统上的单个用户时,这些查询仍然运行得很快,但是您必须考虑在交互式应用程序中使用它们的频率(尤其是随着用户数量的增长)。虽然这些是粗略的数字,但它们说明了一般原则。体系结构和配置会影响系统的处理查询工作负载。决定查询成本的主要因素是查询是否使用了正确的索引。EXPLAIN命令可以告诉您查询是否使用了索引。这就是为什么学习使用EXPLAIN很重要。MySQL优化关键2:创建正确的索引索引可以减少查询必须扫描的数据量,从而提高查询性能。MySQL中的索引用于加速数据库中的访问并帮助实施数据库约束(例如UNIQUE和FOREIGNKEY)。数据库索引很像书籍索引。它们保存在自己的位置并包含主数据库中已有的信息。它们是数据所在的一种引用方法。索引不会改变数据库中的任何数据,它们只是指向数据的位置。当系统运行查询时,您应该始终查看索引。缺少索引也会降低数据库速度。但是不要添加不需要的索引!不必要的索引会降低数据库的速度。MySQL调优要点#3:不要使用默认模式!与任何软件一样,MySQL具有许多可用于修改行为的可配置设置。但是管理员会忽略许多可配置的设置并始终以默认模式运行。要从MySQL获得最佳性能,了解可配置设置很重要,更重要的是,将它们设置为最适合您的数据库环境。默认情况下,MySQL适用于小规模开发安装,不适用于生产规模。您通常将MySQL配置为使用所有可用的内存资源,并根据应用程序的需要允许尽可能多的连接。下面是三个MySQL性能调优设置:(1)innodb_buffer_pool_size:缓冲池是缓存数据和索引的地方。这是使用具有大量RAM的系统作为数据库服务器的主要原因。如果您只运行InnoDB存储引擎,您通常会为缓冲池分配大约80%的内存。如果您运行非常复杂的查询,有大量的并行数据库连接,或者有大量的表,您可能需要将这个值降低一个级别,以便为其他运行分配更多的内存。设置InnoDB缓冲池大小时,不要太大,否则会引起swapping。这绝对会破坏数据库性能。一种简单的检查方法是查看Percona监控和管理系统概览图中的交换活动:如图所示,一些交换非常频繁。如果您看到每秒1MB或更多的恒定交换活动,那么您将需要减少缓冲池大小(或其他内存使用量)。如果您第一次没有获得正确的innodb_buffer_pool_size值,请不要担心。从MySQL5.7开始,可以在不重启数据库服务器的情况下动态更改InnoDB缓冲池的大小。(2)innodb_log_file_size:这是单个InnoDB日志文件的大小。默认情况下,InnoDB使用两个值,以便您可以将此数字加倍以获得确保事务持久运行的循环重做日志空间的大小。这也优化了对数据库的应用更改。设置innodb_log_file_size是一个权衡的问题,分配的redo空间越多,写入密集型工作负载的性能越好,但如果系统遇到断电或其他问题,恢复所需的时间就越长。你怎么知道MySQL的性能受当前InnoDB日志文件大小的限制?您可以通过查看实际使用的重做日志空间来判断。最简单的方法是查看PerconaMonitoringandManagementInnoDBMetrics仪表板。在下图中,InnoDB日志文件大小不够大,因为已用空间非常接近可用重做日志空间(用红线表示)。日志文件大小应至少比用于维持系统执行***性能的空间大20%。(3)max_connections:大型应用程序通常需要比默认连接数多得多的连接数。与其他变量不同,如果设置不正确,则不会(本质上)出现性能问题。相反,如果连接数不足以满足应用程序的需要,那么你的应用程序将无法连接到数据库(这对用户来说就像是中断)。获取这个regime变量非常重要。在具有多个组件在多个服务器上运行的复杂应用程序中,可能很难知道需要多少个连接。但幸运的是,MySQL可以很容易地查看在高峰操作期间使用了多少连接。通常,要确保应用程序使用的最大可用连接数至少比最大连接数大30%。查看这些数字的一种简单方法是使用PerconaMonitoringandAdministrationMySQLOverviewDashboard中的MySQLConnectionGraph。下图显示了一个健康的系统,有很多额外的可用连接。要记住的一件事是,如果您的数据库很慢,应用程序通常会创建太多连接。在这种情况下,您应该处理数据库性能问题,而不是简单地允许更多连接。太多的连接会使潜在的性能问题变得更糟。(注意:当你设置max_connections变量明显高于默认值时,通常需要考虑增加其他参数,比如表缓存的大小和MySQL允许的打开文件数)MySQL优化关键4:保持内存中的数据库近年来,我们看到了固态硬盘(SSD)的变革。尽管SSD比旋转硬盘驱动器快得多,但它们仍然与RAM中的数据不兼容。差异不仅来自存储性能本身,还来自数据库为从磁盘或SSD存储检索数据而必须执行的其他工作。随着硬件的改进,将数据库存储在内存中的可能性越来越大——无论您是在云端运行还是管理自己的硬件。更好的消息是您不需要将所有数据库放入内存,只需将经常访问的工作数据集合放入内存即可。检查数据库在稳定状态下运行的I/O量(通常在启动后几个小时)。您可以在下面看到用于Percona监控和管理的InnoDBMetrics仪表板上的InnoDBI/O。在上图中,您可以看到每秒高达2000次I/O的峰值,这表明(至少对于某些部分的工作负载)数据库工作集与内存不匹配。MySQL优化关键5:如果你的数据库在内存中放不下,但仍然需要快速存储来处理写入并避免在数据库加速时(重启后)出现性能问题,请使用SSD存储。这种快速存储意味着使用SSD。出于成本或可靠性原因,一些“专家”仍然提倡使用旋转磁盘。但在可操作的数据库中,这些观点往往是过时的或错误的。如今,SSD以友好的价格提供令人印象深刻的性能和可靠性。但是,并非所有SSD生而平等。对于数据库服务器,您应该使用专为服务器工作负载设计的SSD。通过NVMe或IntelOptane技术的直连SSD可提供最佳性能。即使作为SAN、NAS或云块设备远程连接时,SSD与旋转磁盘相比仍然具有出色的性能。MySQL优化关键6:向外扩展即使是最好的服务器也有局限性。扩展有两种方式:向上扩展和向外扩展。向上意味着购买更多的硬件,但硬件很贵,而且很快就会过时。out有几个好处:可以利用更小、成本更低的系统。通过横向扩展更快更容易地进行线性扩展。因为数据库分布在多台物理机上,不会因为单椅硬件故障影响数据库。向外扩展虽然有优势,但也有一定的局限性。对于数据同步,缩放需要复制,例如基本的MySQL或PerconaXtraDB集群复制。您还需要确保连接到集群架构的应用程序能够找到它们需要的数据,通常是通过一些代理服务器和负载均衡器,例如ProxySQL或HAProxy。在规划扩展时避免过早扩展对于分布式数据库来说通常更为复杂。MySQL优化要点7:具有可观察性***的系统在设计时就应该考虑到可观察性。一旦您的MySQL环境启动、运行并正确调优,您就不能就此置之不理;您的数据库环境可能会受到系统或工作负载变化的影响。为流量高峰??、应用程序错误和MySQL故障等情况做好准备。当出现这些情况时,您需要快速有效地解决它们。实现这一目标的唯一方法是设置一些监控解决方案并进行适当的检测。这使您可以查看数据库环境中发生的情况,并在出现问题时分析错误。理想情况下,系统将能够在事件发生之前拦截它们。MySQLEnterpriseMonitor、Monyog和PerconaMonitoringandManagement(PMM)都是很好的监控工具,具有免费和开源的优势。这些工具为监控和故障排除提供了良好的操作可见性。随着越来越多的公司转向开源数据库,尤其是MySQL,作为在大规模生产环境中管理和服务业务数据的一种方式,他们需要专注于保持这些数据库以最高效率进行调整和运行。数据库性能可以成就或破坏您的业务目标,MySQL为您的应用程序和网站提供了优质的数据库解决方案,但经过调整以满足您的需求并监控、查找、防止瓶颈和性能问题。
