[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.(이 차이를 만들 않았다 분명히 같은 응답으로 내 의견을 게시!)
(이 차이를 만들 않았다 분명히 같은 응답으로 내 의견을 게시!)
사람이 더 조사를 원한다면 난 그냥 테스트를 수행하고 아주 쉽게 재현 할 수 발견했습니다.
테이블 만들기
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.= 더 나은보다 왜 여기에 좋은 설명입니다
= 더 나은보다 왜 여기에 좋은 설명입니다
잘 (만약 전혀) 인덱스를 사용하지 않는 - 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.당신은 가능한 쿼리가 너무 느려 실행하기위한 방법을 찾기 위해 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
from https://stackoverflow.com/questions/3416076/this-select-query-takes-180-seconds-to-finish by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 삽입 여기서 일하지 않는 무시 내 테이블에서 중복 레코드를 방지하는 방법 (0) | 2020.07.04 |
---|---|
[SQL] SQL : 연속 기록에 그룹으로 (0) | 2020.07.04 |
[SQL] 지난 일요일 찾기 (0) | 2020.07.03 |
[SQL] 절에 SQL에 튜플을 사용하여 (0) | 2020.07.03 |
[SQL] 오라클 DB : java.sql.SQLException의 : 폐쇄 연결 (0) | 2020.07.03 |