2013-04-25 274 views
5

我和我們的團隊遇到了MySQL查詢中的一個奇怪問題。我們使用SELECT聲明與COUNT,由於某種原因,它在我們使用的客戶端(SQLyog)中相當「快速」,但在使用PHP時速度很慢。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的:61年5月1日 PHP:5.3.3

任何建議,以解決這個問題?

+0

請顯示您的php代碼。 – 2013-04-25 07:23:31

+0

您可以將您的查詢保存爲文本文件,並在您的PHP腳本所在的同一臺機器上運行以下代碼: 'time mysql --user = user --password = pass file_get_contents(「query.sql」))); '' 看看有沒有時差? – core1024 2013-04-25 07:29:21

+0

您可以驗證您是否在託管您的PHP的同一臺計算機上運行SQLyog?如果你從兩個不同的主機連接到你的mySql服務器,這可能會解釋_some_的不同。向我們展示PHP代碼? – Sepster 2013-04-25 07:36:40

回答

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" ; 
+0

感謝您的評論!查詢現在速度很快,但它返回原始查詢的不同/錯誤結果。 – 2013-04-25 07:45:46

+0

我認爲,它應該是INNER JOIN db.media_tag_multimedia,並且左加入media.media_tag b – 2013-04-25 07:54:57

+0

@JesperVeldhuizen對不起。查詢糾正(我希望!)。讓我知道,如果這現在好了。 – Sepster 2013-04-25 07:55:15

相關問題