本地mysql服务器和生产mysql服务器之间的显着性能差异

时间:2011-01-17 15:56:58

标签: mysql performance

我是在生产MySQL中运行的应用程序的新维护者。以前的维护者已经离开了很少的文档,并且不可联系。

我面临的问题是以下请求大约需要10秒才能执行:

SELECT COUNT(*) FROM `users` WHERE (`active` = TRUE AND `deleted_at` IS NULL);

users表中有大约170,000条记录,没有索引。

此请求的EXPLAIN命令:

mysql> EXPLAIN SELECT COUNT(*) FROM `users` WHERE (`active` = TRUE AND `deleted_at` IS NULL);
+----+-------------+-------+------+---------------+------+---------+------+--------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows   | Extra          |
+----+-------------+-------+------+---------------+------+---------+------+--------+-------------+
|  1 | SIMPLE      | users | ALL  | NULL          | NULL | NULL    | NULL | 145407 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+--------+-------------+

现任网站所有者(非技术人员)告诉我,2周前表演突然下降。因此,在尝试添加索引之前,我已将生产数据库转储到我的本地MySQL服务器中。同样的请求在本地只需4秒。

我对这种差异感到非常惊讶,我想知道操作系统或MySQL服务器上的某些问题是否可能解释它?是否值得以这种方式进行调查?如果是这样的话?如果没有,对于没有索引的这种查询,这种性能是否“正常”(我对SQL性能的经验有限)?

在服务器上:

$ mysql -u root --version
mysql  Ver 14.14 Distrib 5.1.44, for unknown-linux-gnu (x86_64) using readline 5.1
$ cat /etc/redhat-release 
CentOS release 5.4 (Final)

本地机器:

$ $ mysql -u root --version
mysql  Ver 14.14 Distrib 5.1.42, for apple-darwin10.2.0 (i386) using  EditLine wrapper

谢谢!

Traroth的编辑:

  • RAM:生产时4GB,本地机器上2GB
  • 请求缓存:确实在本地计算机上后续请求要快得多,在生产时它也会变得更好但仍然太慢(在最好的情况下大约5秒)。你认为这是正常的吗?
  • 两个数据库都使用InnoDB
  • filesystem:生产框是VPS,当我查找文件系统时会出现'simfs'

3 个答案:

答案 0 :(得分:0)

可能的差异:

  • 如果你多次运行同一个查询,MySQL会缓存结果,所以每次你在第一次运行结果后,只要结果在缓存中,它就会非常快。
  • 可能是文件系统的差异。您的Linux可能运行ext3或ext4 fs,而您的Mac运行HFSX fs。您应该尝试在Linux机器上运行备份。
  • 您是否在两个版本的数据库上使用相同的数据库引擎?速度可能会有很大差异,具体取决于您使用的(InnoDB,MyISAM等)

答案 1 :(得分:0)

您可以尝试在列active, and deleted_at

上构建索引

我认为delete_at is null只是......

您可能希望将其转换为smallint,默认为0(表示为空)

如果您进行批量删除,optimize table your_table;会压缩数据以获得更好的效果。

答案 2 :(得分:0)

这些机器在许多方面都有所不同(CPU数量,CPU速度,RAM数量,RAM速度,磁盘速度(访问时间和吞吐量),磁盘分配,当然还有系统负载。所以你不应该期望性能是相同。