2013-04-25 219 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

相关问题