簡體   English   中英

在PHP中查詢速度慢但在客戶端快速查詢

[英]Query slow in PHP but fast in client

我和我們的團隊遇到了MySQL查詢的奇怪問題。 我們使用帶有COUNTSELECT語句,由於某種原因,它在我們使用的客戶端(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

有什么建議可以解決這個問題?

我無法解釋性能上的差異,但如果我不得不猜測我會說下面的一個或一些事情在起作用:

  • 由於客戶端連接不同,服務器正在以不同方式優化您的查詢,
  • 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" ;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM