我正在寻找一个调整MySQL服务器常用陷阱和优化的简洁列表,用于中型网站。
一般来说,我在这里寻找的build议types是普通开发人员或pipe理员可以轻松实现的信息,这将会为他的网站的性能带来可观的收益。
举个例子
下面是我从阅读高性能MySQL中得到的一个提示,我经常看到它用于:
当使用MyISAM存储引擎(缺省值)时,服务器将在执行DELETE或UPDATE操作时执行整个表的locking操作,或者在执行INSERT时不会将其附加到表的尾部(因为还有一个“漏洞”以前的DELETE)。 在操作完成之前,没有其他查询可以使用该表。
因此,如果使用除“INSERT”之外的任何操作进行大量修改,则应在任何使用率很高的表上使用InnoDB或其他行级locking引擎。
以下是我在MySQL优化中遇到的一些问题:
如果你看到你的数据库服务器(尤其是MySQL进程)正在使用大部分CPU时间,那么可能意味着你要么缺less索引,要么你需要优化查询。
打开慢查询日志logging,并追踪这些慢查询,以了解如何进行优化。 使用“解释”与慢查询,找出为什么他们慢。 MySQL文档有几个关于如何解释这些结果的部分。
尽可能使用memcachedcaching任何查询的结果。 这是非常快的,能够caching内部MySQL查询caching不能做的许多事情,但只能用于知道数据可以被长期caching的情况,或者手动使caching过期的情况。
在数据库系统上设置“munin”,开始收集有关系统利用率和数据库查询负载的信息。
确保你的系统有足够的内存来存储你不需要交换的内存,并且希望这个内存足够less,如果有光盘读取的话,使用vmstat或者munin来监视这个。 这意味着数据由MySQL或磁盘缓冲区caching提供。
肖恩
对于这个话题不太一般,但是MySQL的优化不一定会导致网站的性能优化。 你上面所描述的只是上百万的一个例子。 在你的networking应用程序中经常出现这种情况吗? MyIssam的这个特殊function如何减慢你的网站? (考虑到MyIssam比InnoDB快几十倍)。 你是怎么发现它是你的情况?
基本上,你的问题没有任何意义,直到你真正地分析你的应用程序,find瓶颈。 否则,一些常见的build议会相互矛盾。
而且,性能优化通常都是关于权衡的。 你将会牺牲另一个优化。
这是一个很好的文章: http : //www.flounder.com/optimization.htm
这不是关于networking应用程序的MySQL,而是关于优化。
有一件事会对MySQL的性能产生不利影响,就是创build磁盘上的临时表。
你可以运行几分钟:
mysqladmin -u root -p ext -ri 30 | grep Created_tmp_disk
如果这个数字很高并且增长的话,你可以考虑把MySQL的tmpdir放在一个基于RAM的文件系统上(例如tmpfs)。
从某种意义上说,这可能是治疗症状而不是原因,但是当你考虑是否/如何治疗病因时,它可以提供一些快速的缓解。 以下链接提供了有关MySQL如何使用内部临时表的信息:
http://dev.mysql.com/doc/refman/5.0/en/internal-temporary-tables.html
干杯
所有伟大的提示。 我会补充的另一个珍闻是,有时你的索引是不够的。 您可能认为添加最多查询行的索引就足够了,但是它们在索引中的顺序会影响性能。 特别是对于InnoDB,它试图从索引中获取所需的数据,而不必获取行本身(即:磁盘查找)。 如果你有一个特别大的查询表以两种方式被几乎同样地查询,那么对于这两种查询types来说,索引的确切顺序是有帮助的。 这对你来说看起来可能是多余的,但实际上它将优化器推向正确的方向:)
另外,服务器variables,MySQL my.cnf文件的“开箱即用”从来都不是正确的。 花费一些时间来检查它的内容并根据你的硬件configuration和你得到最多的查询types来调整值
@TechieGurl,关于您的订单查询条件,你错了。 这是在4.x的早期版本中修复的。 查询优化程序将使用一些度量标准,并使用与最常数条件,范围条件等相匹配的键,并将根据顺序对参数进行整理,假定SQL不包含可能排除此类的优先顺序一个优化。
MyISAM将回答关键结果,InnoDB通常不会在locking行时作为ACID合规性的一部分进行回答,而是通过devise而不是错误的方式。
MySQLTuner是一个用Perl编写的脚本,可以帮助你完成MySQL的configuration,并提高性能和稳定性:http://github.com/rackerhacker/MySQLTuner-perl