我正在寻找一份简洁的清单常见的针对中型网站调整 MySQL 服务器的缺陷和优化。
一般来说,我在这里寻找的建议类型是普通开发人员或管理员可以轻松实施的信息,并且将为其网站的性能带来可衡量的益处。
举个例子
以下是我从阅读中学到的一个小窍门高性能 MySQL我经常看到它的用途:
使用 MyISAM 存储引擎(默认)时,服务器将在执行 DELETE 或 UPDATE 操作时,或执行未附加到表末尾的 INSERT 操作时(因为上一次 DELETE 操作留下了“空洞”)锁定整个表。在操作完成之前,其他查询都无法使用该表。
因此,如果使用除“INSERT”之外的任何操作对任何频繁使用的表进行了大量修改,则应该使用 InnoDB 或其他行级锁定引擎。
答案1
以下是我在 MySQL 优化中遇到的一些事情:
如果您发现数据库服务器(特别是 MySQL 进程)占用了大部分 CPU 时间,则可能意味着您缺少索引或需要优化查询。
打开慢查询日志并跟踪这些慢查询以找出如何优化它们。对慢查询使用“解释”来找出它们慢的原因。MySQL 文档有几个部分介绍如何解释这些结果。
使用 memcached 尽可能长时间地缓存所有查询的结果。这种方法速度极快,能够缓存许多 MySQL 内部查询缓存无法缓存的内容,但只能在您知道数据可以长期缓存或您手动使缓存过期的情况下使用。
在数据库系统上设置“munin”以开始收集有关系统利用率和数据库查询负载的信息。
确保您的系统有足够的 RAM 以便您不进行交换,并且希望有足够的 RAM 以便您很少进行磁盘读取(使用 vmstat 或 munin 来监控这一点)。这意味着数据由 MySQL 或磁盘缓冲区缓存提供。
肖恩
答案2
可能对 MySQL 性能产生不利影响的一件事是创建磁盘临时表。
您可以运行这个几分钟:
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
干杯
答案3
虽然不太切题,但仅优化 MySQL 并不一定能优化网站的性能。您上面描述的只是数百万个可能情况中的一个。这在您的 Web 应用程序中是否很常见?MyIssam 的这一特定功能如何减慢您的网站速度?(考虑到 MyIssam 比 InnoDB 快数十倍或数百倍)。您是如何发现这是您的情况的?
基本上,除非您真正分析应用程序并找到瓶颈,否则您的问题就没有意义。否则,一些常见的建议会互相矛盾。
此外,性能优化通常都是权衡利弊。你必须牺牲一些优化来换取其他优化。
这是一篇很好的入门文章:http://www.flounder.com/optimization.htm
这与 MySQL 或 Web 应用程序无关,而是与优化有关。
答案4
@TechieGurl,关于你对条件的顺序查找,你错了。这个问题在 4.x 的早期版本中已经修复。查询优化器会考虑许多指标,并使用与最恒定的条件、范围条件等匹配的键,并根据顺序对参数进行打乱,前提是 SQL 不包含可能排除此类优化的优先顺序。
MyISAM 将会根据键来回答结果,而 InnoDB 通常不会这样做,并且会在回答时锁定一行,这是 ACID 遵从性的一部分,这是设计使然,而非错误。