8

我和我们的团队在 MySQL 查询中遇到了一个奇怪的问题。我们使用SELECT带有 a 的语句,COUNT出于某种原因,它在我们使用的客户端(SQLyog)中非常“快”,但是当我们使用 PHP 时它真的很慢。

我们尝试使用古老的 mysql_query(),mysqli 扩展,我们也尝试使用 PDO,但都没有任何区别。

在 Stackoverflow 上的其他帖子中,我们发现这可能是一个 DNS 问题,并且可以使用 my.ini 中的“skip_name_resolve”修复它,但我们已经在我们的配置中拥有了这个。

定时结果:

客户端:2.092 秒 PHP:9.1071 秒

这是我们使用的查询:

SELECT SQL_NO_CACHE
  COUNT(m.mm_id) AS total
FROM
  db.media_multimedia m
WHERE m.cat_id IN
  (SELECT
    mc.cat_id
  FROM
    db.media_multimedia_category mc
  WHERE mc.cat_active = 1)
  AND m.mm_published = 1
  AND (
    m.mm_title LIKE "%denniy%"
    OR m.mm_text LIKE "%denniy%"
    OR m.mm_id IN
    (SELECT
      a.mm_id
    FROM
      db.`media_tag_multimedia` a
      LEFT JOIN media.`media_tag` b
        ON a.`tag_id` = b.tag_id
    WHERE b.tag_name LIKE "%denniy%")
  )
  AND m.mm_publishing_date >= "2012-04-24 00:00:00"
  AND m.mm_publishing_date <= "2013-04-24 23:59:59" ;

*注意:对于这个测试用例,我们将 SQL_NO_CACHE 添加到查询中,以确保我们始终获取新的结果集。*

我们使用以下 PHP 和 MYSQL 版本:

MySQL:5.1.61 PHP:5.3.3

有什么建议可以解决这个问题吗?

4

1 回答 1

2

我无法解释性能上的差异,但如果我不得不猜测,我会说以下一项或多项正在发挥作用:

  • 由于不同的客户端连接,服务器正在以不同的方式优化您的查询,
  • SQLyog 和 PHP 客户端的不同位置可能是一个因素

就像我说的,只是猜测。

但无论如何,我已尝试按如下方式整理您的查询。我想知道这是否会表现得更好(并且更一致)?

SELECT SQL_NO_CACHE
  COUNT(m.mm_id) AS total

FROM
  db.media_multimedia m

  INNER JOIN db.media_multimedia_category mc
  ON m.cat_id = mc.cat_id
  AND mc.cat_active = 1

  LEFT JOIN db.media_tag_multimedia a
  ON m.mm_id = a.mm_id

  INNER JOIN media.media_tag b
  ON a.tag_id = b.tag_id

WHERE 
  m.mm_published = 1
  AND 
  (
    m.mm_title LIKE "%denniy%"
    OR 
    m.mm_text LIKE "%denniy%"
    OR 
    b.tag_name LIKE "%denniy%"
  )
  AND m.mm_publishing_date >= "2012-04-24 00:00:00"
  AND m.mm_publishing_date <= "2013-04-24 23:59:59" ;
于 2013-04-25T07:17:44.963 回答