2013-04-25 2 views
5

Me와 저희 팀이 MySQL 쿼리에 이상한 문제가 있습니다. 우리는 COUNT과 함께 SELECT 문을 사용합니다. 그리고 어떤 이유에서 우리가 사용하는 클라이언트 (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 : 5.1.61 PHP : 5.3.3

어떤 제안이 문제를 해결하려면?

내가 추측이 있다면 나는 다음 중 한 가지 또는 몇 가지를 말하고 싶지만하지만 나는, 성능의 차이를 설명 할 수
+0

당신의 PHP 코드를 보여주십시오. –

+0

쿼리를 텍스트 파일에 저장하고 PHP 스크립트가있는 컴퓨터에서 다음 코드를 실행할 수 있습니다 : 'time mysql --user = user --password = pass file_get_contents ("query.sql"))); php -r '새로운 PDO ("mysql : host = ...; dbname = ...", "사용자", "패스" '' 시간 차이가 있는지 확인 하시겠습니까? – core1024

+0

PHP를 호스팅하는 컴퓨터에서 SQLyog를 실행하고 있는지 확인할 수 있습니까? 두 개의 다른 호스트에서 mySql 서버에 연결하는 경우 _Some_ 차이를 설명 할 수 있습니다. PHP 코드를 보여 주시겠습니까? – Sepster

답변

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

귀하의 의견을 보내 주셔서 감사합니다! 이제 쿼리가 빠르지 만 원본 쿼리 이후 다른/잘못된 결과를 반환합니다. –

+0

내가 생각하기에, 그것은 INNER JOIN db.media_tag_multimedia 여야하며, LEFT는 media.media_tag에 합류한다. –

+0

@JesperVeldhuizen 죄송합니다. 검색어 수정 (희망!). 이게 지금 제대로 작동하는지 알려주세요. – Sepster

관련 문제