MySQL数据库优化最佳实践

时间:2009-02-23 20:42:19

标签: mysql database performance

在处理更大的表(> 50k记录,每个表总共大约100MB)时,优化MySQL安装以获得最佳性能的最佳做法是什么?我们目前正在考虑重写DelphiFeeds.com(Delphi编程社区的新闻站点)并注意到简单的Update语句可能需要50ms。这似乎很多。是否有任何我们应该启用/设置的配置设置通常在标准MySQL安装上禁用(例如,利用更多RAM来缓存查询和数据等等)?

此外,存储引擎的选择对性能有何影响?我们计划使用InnoDB,但如果出于性能原因推荐使用MyISAM,我们可能会使用MyISAM。

4 个答案:

答案 0 :(得分:16)

“最佳实践”是:

  1. 测量性能,尽可能隔离相关子系统。
  2. 找出瓶颈的根本原因。你受I / O约束吗? CPU绑定?记忆力?等待锁?
  3. 进行更改以减轻您发现的根本原因。
  4. 再次测量,以证明您修复了瓶颈,修复了多少
  5. 转到步骤2并根据需要重复,直到系统运行得足够快。
  6. 订阅http://www.mysqlperformanceblog.com的RSS Feed,并阅读其历史文章。对于与绩效相关的智慧而言,这是一个非常有用的资源。例如,您询问了InnoDB与MyISAM的关系。他们的结论是:InnoDB的性能平均比MyISAM高约30%。虽然也有一些使用场景MyISAM胜过InnoDB。

    该博客的作者也是@Andrew Barnett提到的“高性能MySQL”的合着者。


    来自@ʞɔıu的评论:如何判断你是否受I / O限制而不是CPU绑定与内存绑定是平台相关的。操作系统可能提供ps,iostat,vmstat或top等工具。或者,如果您的操作系统没有提供第三方工具,您可能需要获得第三方工具。

    基本上,无论哪种资源与100%利用/饱和挂钩,都可能是您的瓶颈。如果你的CPU负载很低,但你的硬件的I / O负载达到最大值,那么你就是I / O限制。

    然而,这只是一个数据点。补救措施也可能取决于其他因素。例如,复杂的SQL查询可能正在执行文件排序,这会使I / O忙碌。你应该向它投掷更多/更快的硬件,还是应该重新设计查询以避免文件存储?

    在StackOverflow帖子中总结的因素太多,而且该主题上存在的许多书籍支持这一点。保持数据库有效运作并充分利用资源是一项需要专业技能和不断学习的全职工作。


    杰夫阿特伍德刚写了一篇关于在系统中发现瓶颈的好文章:

答案 1 :(得分:7)

从O'Reilly购买“高性能MySQL”。这个主题差不多有700页,所以我怀疑你会在SO上找到一个简洁的答案。

答案 2 :(得分:5)

很难广泛宣传,但可以采用适度的高级视角。

  • 您需要评估读取:写入比率。对于比率低于约5:1的表,您可能会从InnoDB中受益,因为插入不会阻止选择。但是,如果您不使用交易,则应将innodb_flush_log_at_trx_commit更改为1,以便通过MyISAM获得性能。
  • 查看内存参数。 MySQL的默认值非常保守,即使普通硬件也可以将一些内存限制提高10倍或更多。这将有利于SELECT而不是INSERT。
  • MySQL可以记录诸如不使用索引的查询之类的内容,以及仅花费太长时间(用户可定义)的查询。
  • 查询缓存可能很有用,但您需要对其进行检测(即查看它的使用量)。仙人掌可以做到这一点;和Munin一样。
  • 应用程序设计也很重要:
    • 轻微缓存频繁获取但较小的数据集将有很大的不同(即几秒钟的缓存生命周期)。
    • 不要重新获取您已经拥有的数据。
    • 多步存储可以帮助大量插入到表格中,这些表格也很容易阅读。基本思想是你可以有一个临时插入表(INSERT DELAYED也很有用),但是有一个批处理过程可以将MySQL内的更新从那里移到所有读取的地方。这有各种变化。
  • 不要忘记,视角和背景也很重要:如果“长”更新每天只发生一次,那么你认为UPDATE发生的很长时间实际上可能非常微不足道。

答案 3 :(得分:4)

之前已经讨论过许多最佳实践,因此没有理由重复这些实践。对于实际的具体建议,我会尝试运行MySQL Tuner。它是一个perl脚本,您可以下载然后在您的数据库服务器上运行,它将为您提供一堆关于数据库执行情况的统计信息(例如缓存命中)以及需要调整哪些问题或配置参数的一些具体建议提高性能。

虽然这些统计数据在MySQL本身都可用,但我发现这个工具以更容易理解的方式提供它们。虽然重要的是要注意YMMV与建议的关系,但我发现它们通常非常准确。只需确保您事先通过实际流量完成了数据库的操作。