MySQL查询在实时数据库上运行缓慢,本地快速?

时间:2013-01-28 18:07:34

标签: mysql

我正在努力优化MySQL查询,但遇到了一个奇怪的问题。我从不使用实时生产数据库,因此我创建了它的转储并使用mysqldump将其导入到本地计算机上的数据库中,没有额外的选项。

生产数据库和本地虚拟机上的mysql版本几乎完全相同:

生产: mysql Ver 14.14 Distrib 5.1.61,debian-linux-gnu(x86_64)使用readline 6.2

虚拟机: mysql Ver 14.14 Distrib 5.1.63,debian-linux-gnu(x86_64)使用readline 6.2

这一个查询非常复杂,生产需要大约4-5秒,但在VM上只需不到1秒。我唯一能想到的是,生产数据库上可能存在阻止查询立即运行的锁定,并且查询必须等待锁定?

对每个数据库运行查询时EXTENDED EXPLAIN几乎相同,只有一点点差异。

我在查询之前使用SQL_NO_CACHE以确保查询没有达到缓存。

所以我的问题是:

  1. 当我使用生产数据库的副本,并且mysql版本相同时,是什么原因导致EXTENDED EXPLAIN有所不同,甚至是轻微的?
  2. 我是否有任何理由认为这会导致同一查询在生产数据库上花费更长时间?

1 个答案:

答案 0 :(得分:2)

有很多事情会影响执行时间:

生产系统上的装载情况如何?你有多少IO余量?如果您的系统正忙于运行其他查询或执行大量IO,则任何查询的性能都将严重受损。

通常,您可以使用SHOW PROCESSLIST来帮助确定当前正在运行的内容以及iotop之类的程序,以查看正在进行的IO操作。

您的虚拟机是否正在运行SSD?即使是配备SSD的中端开发机器也会吹掉几乎任何基于HD的数据库服务器,因为它严重依赖于随机访问。

你有没有在生产系统上试过OPTIMIZE TABLE?执行还原时,表始终会自动优化。在实时系统中,表格会慢慢降低,因为INSERTDELETE行。

确保两者都使用相同的存储引擎。 MyISAM通常比InnoDB更快,但在关键数据的生产环境中使用是不安全的。检查SHOW TABLE STATUS以查看每个表使用的引擎。您可能有不同的默认值。

同时检查/etc/my.cnf是否已相应调整。 MySQL的默认配置是糟糕。你真的需要为InnoDB缓冲区分配更多的内存,否则性能会非常糟糕。