2013-04-13 3 views
0

이 쿼리를 최적화하려고했지만 특정 비즈니스 요구 사항으로 인해 쿼리를 수행 할 수 없습니다.mysql 쿼리가 최적화되지 않았습니다.

테이블 :

  • b2 : 약 2mil 기록, 저장 비즈니스 기록
  • business_reviews : 작은 테이블, 기업을위한 저장 리뷰 (각 비즈 여러 리뷰를 가질 수 있습니다)
  • business_feature_item : 작은 테이블, 저장 비즈니스를위한 기능 (각 비즈는 여러 기능을 가질 수 있습니다.)

결과에 대한 특정 비즈니스 요구 사항은 다음과 같습니다.

  • 쇼 비즈니스 기록
  • 는 기능도
  • b2.starbiz 정렬 및 (MATCH 반대에 의해 생성 된) 점수
을 검색 할 수뿐만 아니라 비즈니스
  • 쇼 관련 리뷰

    현재 쿼리가 임시 테이블, 유니온 모두 및 정렬을 사용하므로 결과가 클 경우 잘 작동하지 않습니다. 더 효율적으로 작동하도록이 쿼리를 다시 작성하는 방법이 있습니까?

    SELECT temp.* FROM 
    
    (SELECT DISTINCT b.business_id, b.description AS `extra`, '1' AS `type`, 0 as score 
    
    FROM b2 as b 
    
    LEFT JOIN business_feature_item AS i ON b.business_id = i.business_id 
    
    WHERE ((b.cat_id = '93' OR b.cat_id2 = '93' OR b.cat_id3 = '93')) 
    
    AND b.city_id = '152262' 
    
    AND `approved`=1 
    
    UNION ALL SELECT b.business_id, review_desc AS `extra`, '2' AS `type`, ((MATCH   `review_desc` AGAINST ('"restaurants"' IN BOOLEAN MODE) * 4) + (MATCH `review_desc` AGAINST ('restaurants' IN BOOLEAN MODE))) AS score 
    
    FROM b2 AS b, business_reviews AS r 
    
    WHERE b.business_id =r.business_id 
    
    AND b.city_id = '152262' 
    
    AND (MATCH `review_desc` AGAINST ('"restaurants"' IN BOOLEAN MODE) 
    
    OR MATCH `review_desc` AGAINST ('restaurants' IN BOOLEAN MODE))) 
    
    AS temp 
    
    GROUP BY temp.business_id 
    
    ORDER BY starbiz DESC, score DESC 
    
  • +0

    이 읽을 수 있도록 질문의 형식을 시도하십시오. 감사. –

    +1

    select 문을 단순화 할 수 있습니까? –

    +0

    선택 필드를 자름 – user2170712

    답변

    1

    MySQL이 어떤 인덱스를 사용하지하게, 대신 풀 테이블 스캔을 할 것 OR 절을 사용.

    대신 OR의의 UNION ALL의를 사용하는 쿼리를 다시 작성하십시오 :

    SELECT temp.* FROM 
    (
        SELECT DISTINCT 
         b.business_id, 
         b.description AS `extra`, 
         '1' AS `type`, 
         0 as score 
        FROM 
         b2 as b 
        LEFT JOIN 
         business_feature_item AS i ON b.business_id = i.business_id 
        WHERE 
         b.cat_id = '93' 
         AND b.city_id = '152262' 
         AND `approved`=1 
    UNION ALL 
        SELECT DISTINCT 
         b.business_id, 
         b.description AS `extra`, 
         '1' AS `type`, 
         0 as score 
        FROM 
         b2 as b 
        LEFT JOIN 
         business_feature_item AS i ON b.business_id = i.business_id 
        WHERE 
         b.cat_id2 = '93' 
         AND b.city_id = '152262' 
         AND `approved`=1 
    UNION ALL 
        SELECT DISTINCT 
         b.business_id, 
         b.description AS `extra`, 
         '1' AS `type`, 
         0 as score 
        FROM 
         b2 as b 
        LEFT JOIN 
         business_feature_item AS i ON b.business_id = i.business_id 
        WHERE 
         b.cat_id3 = '93' 
         AND b.city_id = '152262' 
         AND `approved`=1 
    UNION ALL 
        SELECT 
         b.business_id, 
         review_desc AS `extra`, 
         '2' AS `type`, 
         MATCH `review_desc` AGAINST ('"restaurants"' IN BOOLEAN MODE) * 4 AS score 
        FROM 
         b2 AS b, 
         business_reviews AS r 
        WHERE 
         b.business_id =r.business_id 
         AND b.city_id = '152262' 
         AND MATCH `review_desc` AGAINST ('"restaurants"' IN BOOLEAN MODE) 
    UNION ALL 
        SELECT 
         b.business_id, 
         review_desc AS `extra`, 
         '2' AS `type`, 
         MATCH `review_desc` AGAINST ('restaurants' IN BOOLEAN MODE) AS score 
        FROM 
         b2 AS b, 
         business_reviews AS r 
        WHERE 
         b.business_id =r.business_id 
         AND b.city_id = '152262' 
         AND MATCH `review_desc` AGAINST ('restaurants' IN BOOLEAN MODE) 
    ) 
    AS temp 
    GROUP BY temp.business_id 
    ORDER BY starbiz DESC, score DESC 
    
    +0

    감사합니다. 오류 발생 : # 1064 - SQL 구문에 오류가 있습니다. 올바른 구문을 보려면 MySQL 서버 버전에 해당하는 매뉴얼을 확인하십시오. 'FROM b2 AS b, business_reviews AS r WHERE b.busin'at line 50 – user2170712

    +0

    이 실제로 발견되었습니다.) 그 것을 변경하고 b.starbiz 절을 선택합니다. 결과가 예상대로되는지 테스트하려고합니다. – user2170712

    +0

    행 0 - 29 (총 436 개, 쿼리 소요 시간 0.2031 초), 이전보다 빠르게 작동하지만 여전히 느림 – user2170712

    관련 문제