복붙노트

[SQL] 이 SELECT 쿼리는 마무리 180 초 소요

SQL

이 SELECT 쿼리는 마무리 180 초 소요

최신 정보:

그냥 더 눈에 보이는 장소에 그것을 언급한다. 내가 = 대한 IN을 변경하는 경우, 쿼리 실행 시간은 0.00008 초에 180 아래로 갔다. 말도 속도 차이.

이 SQL 쿼리는 마무리 180 초 정도 걸립니다! 그게 어떻게 가능할까요? 빠를를 최적화하는 방법은 무엇입니까?

SELECT IdLawVersionValidFrom 
FROM question_law_version 
WHERE IdQuestionLawVersion IN 
  (
  SELECT MAX(IdQuestionLawVersion) 
  FROM question_law_version 
  WHERE IdQuestionLaw IN 
    (
    SELECT MIN(IdQuestionLaw) 
    FROM question_law 
    WHERE IdQuestion=236 AND IdQuestionLaw>63
    )
  )

너무 느린해서는 안 각 테이블에서만 약 5000 행이 있습니다.

해결법

  1. ==============================

    1.(이 차이를 만들 않았다 분명히 같은 응답으로 내 의견을 게시!)

    (이 차이를 만들 않았다 분명히 같은 응답으로 내 의견을 게시!)

    사람이 더 조사를 원한다면 난 그냥 테스트를 수행하고 아주 쉽게 재현 할 수 발견했습니다.

    테이블 만들기

    CREATE TABLE `filler` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      PRIMARY KEY (`id`)
    ) 
    

    프로 시저를 만들

    CREATE PROCEDURE `prc_filler`(cnt INT)
    BEGIN
            DECLARE _cnt INT;
            SET _cnt = 1;
            WHILE _cnt <= cnt DO
                    INSERT
                    INTO    filler
                    SELECT  _cnt;
                    SET _cnt = _cnt + 1;
            END WHILE;
    END
    

    채우기 표

      call prc_filler(5000)
    

    쿼리 1

    SELECT id 
    FROM filler 
    WHERE id =  (SELECT MAX(id) FROM filler  WHERE id =   
     ( SELECT MIN(id) 
        FROM filler
        WHERE id between 2000 and 3000
        )
      )
    

    같음이 출력 설명 http://img689.imageshack.us/img689/5592/equals.png

    질의 2 (같은 문제)

    SELECT id 
    FROM filler 
    WHERE id in  (SELECT MAX(id) FROM filler  WHERE id in   
     ( SELECT MIN(id) 
        FROM filler
        WHERE id between 2000 and 3000
        )
      )
    

    출력 http://img291.imageshack.us/img291/8129/52037513.png 설명에서

  2. ==============================

    2.= 더 나은보다 왜 여기에 좋은 설명입니다

    = 더 나은보다 왜 여기에 좋은 설명입니다

    잘 (만약 전혀) 인덱스를 사용하지 않는 - MySQL은 내부 쿼리에 문제가 있습니다.

    어쨌든:

    SELECT
             IdLawVersionValidFrom 
    FROM 
             question_law_version 
        JOIN 
             question_law
          ON 
             question_law_version.IdQuestionLaw = question_law.IdQuestionLaw
    WHERE 
             question_law.IdQuestion=236 
         AND 
             question_law.IdQuestionLaw>63
    
    ORDER BY 
             IdQuestionLawVersion DESC, 
             question_law.IdQuestionLaw ASC
    LIMIT 1
    
  3. ==============================

    3.당신은 가능한 쿼리가 너무 느려 실행하기위한 방법을 찾기 위해 EXPLAIN 사용할 수 있습니다.

    당신은 가능한 쿼리가 너무 느려 실행하기위한 방법을 찾기 위해 EXPLAIN 사용할 수 있습니다.

    MySQL은 무슨 일하는이 가고 최소 및 최대를 얻을 결과를 재사용 실패 할 디스크의 종류를 않는다는 것입니다 그래서 아마 중첩 된 부속 선택처럼 정말하지 않습니다.

    다시 쓰기로 아마 도움이 될 합류했다.

    그냥 빨리 수정 시도를 찾는 경우 :

    SET @temp1 =     
      (
      SELECT MIN(IdQuestionLaw) 
      FROM question_law 
      WHERE IdQuestion = 236 AND IdQuestionLaw > 63
      )
    
    SET @temp2 = 
      (
      SELECT MAX(IdQuestionLawVersion) 
      FROM question_law_version 
      WHERE IdQuestionLaw = @temp1
      )
    
    SELECT IdLawVersionValidFrom 
    FROM question_law_version 
    WHERE IdQuestionLawVersion = @temp2
    
  4. from https://stackoverflow.com/questions/3416076/this-select-query-takes-180-seconds-to-finish by cc-by-sa and MIT license