1

我正在优化 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. EXTENDED EXPLAIN当我使用生产数据库的副本并且 mysql 版本相同时,可能会导致什么不同,甚至是轻微的不同?
  2. 有什么理由我没有想到会导致相同的查询在生产数据库上花费更长的时间?
4

1 回答 1

3

有许多因素可能会影响此执行时间:

您的生产系统上的负载情况如何?你有多少 IO 空间?如果您的系统忙于运行其他查询或执行繁重的 IO,任何查询的性能都会受到严重影响。

通常,您可以使用它SHOW PROCESSLIST来帮助识别当前正在运行的程序iotop,以及查看正在进行的 IO 的程序。

您的虚拟机是否使用 SSD?即使是带有 SSD 的中端开发机器,对于任何严重依赖随机访问的东西,几乎所有基于 HD 的数据库服务器都会被淘汰。

你试过OPTIMIZE TABLE生产系统吗?当您进行恢复时,表总是会自动优化。在实时系统上,表格会随着您INSERTDELETE行而缓慢降级。

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

还要检查是否进行了/etc/my.cnf相应调整。MySQL 的默认配置很糟糕。您确实需要为 InnoDB 缓冲区分配更多内存,否则性能会很糟糕。

于 2013-01-28T18:13:53.973 回答