我们有一个运行基于 PHP/MySQL 的 Web 应用程序的服务器,它的速度很慢。
我的前任说:
我们过去常常进行数据库维护,清除缓冲区、缓存和不需要的变量。
我想知道他这句话到底是什么意思?他是指对表进行简单的优化吗?还是查询缓存?我了解 MySQL,但不知道他在描述什么。
我将非常感激任何指点。
答案1
如果他们的维护操作是在正在运行的服务器上执行的,我只能想到“刷新表”(来自 MySQL 手册:关闭所有打开的表,强制关闭所有正在使用的表,并刷新查询缓存。FLUSH TABLES 还会从查询缓存中删除所有查询结果)。
但也许他们只是重新启动了服务器……
对于“慢”的部分,假设你正在运行 unix 系统,你可以尝试使用mysql 调优入门或者mysqltuner.pl了解一下你可以在服务器配置中更改什么
答案2
我对数据库维护中清除缓冲区以提高速度的想法感到畏惧。如果您的系统运行缓慢,而答案是这样的,我怀疑事情是否做得正确。
解决此问题的正确方法是找出瓶颈所在。瓶颈通常是磁盘(通常是内存分配不足的延伸)或 CPU。
您的数据库负载是多少?如果没有,您是否应该使用 InnoDB 表?查询是否编写得有效?
“如何在负载下设置 MySQL 服务器”是一本信息量很大的书。首先假设一切都是错误的,然后考虑让外行花一两个小时帮你看看。
答案3
还有一些需要考虑的事情:
如果大多数表是 InnoDB,您可能需要考虑在 /etc/my.cnf 中设置以下内容:
[mysqld]
innodb_max_dirty_pages_pct=0;
在 MySQL 5.1 及以前版本中,默认值为 90;
在 MySQL 5.5 中,默认值为 75;
将 innodb_max_dirty_pages_pct 设置为零(0)可使 InnoDB 数据页最大限度地从 innodb 缓冲池刷新到磁盘(高达 99.1%)。
无需调整任何其他内容,这还可以在存在大量 InnoDB 数据的情况下更快地关闭 mysqld,因为 mysqld 在关闭时会刷新 innodb 缓冲池。
实际上,您可以即时设置此项,而无需重新启动 mysql:
mysql> SET GLOBAL innodb_max_dirty_pages_pct=0;