【问题标题】:MySQL application performance issueMySQL 应用程序性能问题
【发布时间】:2017-01-25 10:40:35
【问题描述】:

我们希望通过基于 MySQL 和 PHP 的应用程序获得更好的性能。

目前的情况是一个电子学习系统,根据星期几和/或一天中的时间接收一些“突发”查询。 (例如,数百名来自不同学校的学生同时开始训练)

您可能已经猜到,这些系统一直都需要实时计算。

一般来说,我们很少有慢查询,当它们出现在日志中时,我们会尝试改进它们。

硬件是自托管的,目前是 VPS,不是我们的硬件,但我们将硬件升级作为解决方案的一部分。

我们有一个读/写密集型的特定表。我们认为它涉及对该表的磁盘访问。 (学习日志)

我们正在尝试找出可以提高性能的硬件和/或软件设置,尤其是在需要该日志表时。

我们正在考虑的一种解决方案是使用复制来平衡“写入”和“读取”查询。 (代理 SQL + 复制) 如果主人不可用,我们担心这种设置会发生什么......

我们目前正在开发的一种软件可能性是创建一个“汇总”表,每天只计算一次左右。这应该至少在应用程序的 2 个屏幕上释放一些压力。在这种情况下,瓶颈似乎与临时表的创建和连接表的数量有关。

我可以根据需要添加详细信息,请不要犹豫。

编辑:重新制定

有哪些可能的 MySQL 设置可用于获得更好的性能?复制、集群还是其他?

非常感谢您的宝贵时间。

【问题讨论】:

  • 好的。感谢您的状态报告……尽管这个社区专注于问题
  • 我明白了,我可能没有说清楚。我编辑了帖子。
  • 您可能希望至少试用 APM,例如 new relic 或 appdynamics,以确定您的实际瓶颈在哪里。如果大部分时间都花在等待数据库读取上,则绝对应该添加一些从数据库服务器。
  • 请提供一些常见/慢速查询以及SHOW CREATE TABLE。有时,改进就像添加复合索引一样简单。

标签: php mysql optimization


【解决方案1】:

由于您没有为您的问题添加任何代码,所以我只是一般地回答您:

  1. 通过memory_get_usage() 计算内存使用量。 把它放在代码的最后一行

  2. 通过sys_getloadavg() 检查加载平均值。 把它放在代码的最后一行

  3. 通过microtime()检查运行时间。 Accurate way to measure execution times of php scripts

  4. 通过select * from sys.x$statement_analysis

  5. 查看哪个查询花费更多
  6. 仅通过 ONE 运行计算性能并尝试使其更好。

  7. 找到您正在散列的位置。例如查找您在哪里使用crypt。一些散列方法可能会花费你太多。找到你真正不需要它们的地方,在那个地方你可以使用低成本的散列,比如sha1md5。例如,如果您在公用文件夹中散列用户头像,则可以使用md5 之类的东西来降低成本。 但你永远不会在安全问题上追求性能。例如密码哈希永远不会追求性能。

  8. 可以缓存一些可以缓存的地方。它确实可以帮助您提高整体性能。阅读PHP Cache Dynamic Pages To Speed Up Load Times。您也可以使用 Apache How To Configure Content Caching Using Apache Modules On A VPS 和 nginx A Guide to Caching with NGINX and NGINX Plus 进行缓存。

  9. 在您的查询中不要使用不能使用索引的东西(您不能总是这样做,但要尽可能地这样做)。例如find_in_set 对性能有很大影响。特别是当您处理大量档案时。

  10. 如果您真的认为制作日志会影响您的性能,请将日志保存在另一台服务器上。您可以使用 IP 从当前服务器连接到另一台服务器上的 MySQL。您也可以为此制作 API。

  11. 始终考虑更好的架构。有时通过查看代码,您会发现某些内容可以被删除或替换为更好的想法。

【讨论】:

  • 非常感谢您的回答,我们会尝试这些并分析事情,然后决定哪种操作是最好的。关于复制可能的横向扩展,一个简单的主从就足够了,有什么需要特别注意的地方吗?
  • @CedricSimon 这是您的选择之一,但我强烈建议您在一次运行中测量您当前的内存使用情况、执行时间和平均加载,并尝试使其变得更好。有时您可以看到删除一个重散列或删除一个 find_in_set 运行时间将快 2 倍,而无需增加任何硬件。在繁重的工作中,您首先需要使您的代码具有出色的性能,因此您需要查看所有内容。我还编辑 #7 并将 #10 添加到我的答案中。如果你不这样做,也许这个可以是#11:stackoverflow.com/a/39931493/5617911
猜你喜欢
  • 2020-04-04
  • 1970-01-01
  • 2012-08-22
  • 2018-07-18
  • 1970-01-01
  • 1970-01-01
  • 2020-08-26
  • 2017-07-02
  • 1970-01-01
相关资源
最近更新 更多