【问题标题】:Why is this MySQL query slower on one server than another?为什么这个 MySQL 查询在一台服务器上比另一台服务器慢?
【发布时间】:2013-01-15 13:16:09
【问题描述】:

我有一个要优化的 SQL 查询。有趣的是,在一台 MySQL 服务器上,查询运行时间约为 0.06 秒,对此我很满意,但在另一台服务器上,查询运行时间接近 0.2 秒(两倍长)。

SELECT fo.facets_id, fo.facets_options_id, fo.value
FROM facets_options fo
INNER JOIN categories_facets cf ON cf.facets_options_id=fo.facets_options_id
INNER JOIN categories c ON c.categories_id=cf.categories_id
WHERE fo.facets_id="2"
AND fo.language_id = "1"
AND c.enabled=1
GROUP BY fo.facets_options_id
ORDER BY fo.value ASC;

两台服务器上的“EXPLAIN”输出相同:

id          select_type          table  type   possible_keys                                             key               key_len  ref                        rows Extra
1           SIMPLE               fo     ref    PRIMARY,facets_options_id,facets_id,facets_id_2           facets_id         4        const                      986  Using where; Using temporary; Using filesort
1           SIMPLE               cf     ref    PRIMARY,categories_id,categories_id_2,facets_options_id   facets_options_id 4        mydb.fo.facets_options_id  37   
1           SIMPLE               c      eq_ref PRIMARY,enabled                                           PRIMARY           4        mydb.cf.categories_id      1    Using where

查询运行缓慢的服务器使用 MySQL 5.1.66,查询运行速度快的服务器使用 MySQL 5.5.29。

是不是新版本的 MySQL 在优化查询方面做得更好?还是有其他原因可能导致它?我怎样才能更多地了解幕后发生的事情?

【问题讨论】:

  • 你有这个实验的对照组吗?
  • MySQL 5.5 确实带来了很多性能改进,尤其是对于 InnoDB 和多线程环境。
  • 这是因为mysql版本不同
  • Waleed,是的,查询在几乎相同的表 + 数据上运行,在这里和那里给或取几行。 Michal,如果可以的话,我会接受你的评论作为答案,假设我无法进一步了解 MySQL 是如何执行查询的?
  • 简单测试:将 5.1 安装到“好”服务器上,以便您使用相同的硬件设置进行测试。如果 5.5 保持更快,那就是版本差异。

标签: mysql query-optimization mysql-5.1 mysql-5.5


【解决方案1】:

我假设两台服务器上的硬件相同。

您可以使用分析器查看差异的来源。

SET profiling = 1;
SELECT /*yourquery...*/
SHOW PROFILES;
/*lookup the id for your query*/
SHOW PROFILE FOR QUERY 1 /*or whatever id your query has*/

你会得到一个详细的清单,花了多长时间等等......

还有EXPLAIN EXTENDED,您可以通过它查看优化后的查询。

一个例子是手册中的here

除此之外,很可能差异来自不同的 MySQL 版本。

Percona 确实调查了从 5.1 到 5.5 的性能改进。结果是here

【讨论】:

  • 如何“查找查询的 id”?
  • 当您执行SHOW PROFILES 命令时,您将看到自SET profiling = 1; 命令以来执行的查询列表。您还会在此处看到此查询的 ID。
猜你喜欢
  • 2013-10-24
  • 2020-04-14
  • 2020-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-02
  • 1970-01-01
相关资源
最近更新 更多