我和我们的团队遇到了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" ;
Run Code Online (Sandbox Code Playgroud)
*注意:对于此测试用例,我们在查询中添加了SQL_NO_CACHE,以确保始终获取新的结果集.*
我们使用以下PHP和MYSQL版本:
MySQL:5.1.61 PHP:5.3.3
有什么建议可以解决这个问题?
我无法解释性能上的差异,但如果我不得不猜测的话,我会说以下一个或一些因素正在发挥作用:
就像我说的,只是猜测。
但无论如何,我已尝试按如下方式整理您的查询。我想知道这是否会表现得更好(并且更一致)?
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" ;
Run Code Online (Sandbox Code Playgroud)