在处理更大的表(> 50k记录,每个表总共大约100MB)时,优化MySQL安装以获得最佳性能的最佳实践是什么?我们目前正在考虑重写DelphiFeeds.com(Delphi编程社区的新闻站点)并注意到简单的Update语句可能需要50ms.这似乎很多.是否有任何我们应该启用/设置的配置设置通常在标准MySQL安装上禁用(例如,利用更多RAM来缓存查询和数据等)?
此外,存储引擎的选择对性能有何影响?我们计划使用InnoDB,但如果出于性能原因推荐使用MyISAM,我们可能会使用MyISAM.
"最佳实践"是:
测量性能,尽可能隔离相关子系统.
找出瓶颈的根本原因.你受I/O约束吗?CPU绑定?记忆力?等待锁?
进行更改以减轻您发现的根本原因.
再次测量,以证明您修复了瓶颈和多少.
转到步骤2并根据需要重复,直到系统运行得足够快.
订阅http://www.mysqlperformanceblog.com上的RSS源并阅读其历史文章.对于与绩效相关的智慧而言,这是一个非常有用的资源.例如,您询问了InnoDB与MyISAM的关系.他们的结论是:InnoDB的性能平均比MyISAM高约30%.虽然还有一些使用场景,其中MyISAM优于InnoDB.
InnoDB vs. MyISAM vs. Falcon基准 - 第1部分
该博客的作者也是@Andrew Barnett提到的"高性能MySQL"的合着者.
来自@ʞɔıu的评论:如何判断你是否受I/O限制而不是CPU绑定与内存绑定是平台相关的.操作系统可能提供ps,iostat,vmstat或top等工具.或者,如果您的操作系统没有提供第三方工具,您可能需要获得第三方工具.
基本上,无论哪种资源与100%利用率/饱和度挂钩,都可能成为您的瓶颈.如果您的CPU负载较低,但您的硬件的I/O负载达到最大值,那么您将受到I/O限制.
然而,这只是一个数据点.补救措施也可能取决于其他因素.例如,复杂的SQL查询可能正在执行文件排序,这会使I/O忙碌.你应该向它投掷更多/更快的硬件,还是应该重新设计查询以避免文件存储?
在StackOverflow帖子中总结了太多因素,并且关于该主题的许多书籍都支持这一点.保持数据库有效运作并充分利用资源是一项全职工作,需要专业技能和不断学习.
杰夫阿特伍德刚写了一篇关于在系统中找到瓶颈的好文章:
计算机性能外壳游戏
从O'Reilly购买"高性能MySQL".这个主题差不多有700页,所以我怀疑你会在SO上找到一个简洁的答案.
很难广泛宣传,但可以采用适度的高级视图.
您需要评估读取:写入比率.对于比率低于约5:1的表,您可能会受益于InnoDB,因为插入不会阻止选择.但是,如果您不使用事务,则应更改innodb_flush_log_at_trx_commit
为1以通过MyISAM获得性能.
查看内存参数.MySQL的默认值非常保守,即使普通硬件也可以将一些内存限制提高10倍或更多.这将有利于SELECT而不是INSERT.
MySQL可以记录诸如不使用索引的查询之类的内容,以及仅花费太长时间(用户可定义)的查询.
查询缓存可能很有用,但您需要对其进行检测(即查看它的使用量).仙人掌可以做到这一点; 就像穆宁一样.
应用程序设计也很重要:
轻微缓存频繁获取但小的数据集将有很大的不同(即几秒钟的缓存寿命).
不要重新获取您已经拥有的数据.
多步存储可以帮助将大量插入到表中,这些表也可以快速读取.基本思想是你可以有一个临时插入表(INSERT DELAYED
也可以是有用的),但是有一个批处理过程可以将MySQL中的更新从那里移到所有读取的地方.这有变化.
不要忘记,视角和背景也是重要的:UPDATE
如果"长"更新每天只发生一次,那么您可能认为发生的很长时间实际上可能非常微不足道.