Explain 쿼리에서 const 테이블을 읽은 후 주목할 수없는 이유는 무엇입니까?


27

테이블에 fr (fromid, toid)와 같은 고유 한 복합 키가 있는데, Explain으로 쿼리를 실행하면 다음 결과가 나타납니다.

Impossible WHERE noticed after reading const tables`

내가 실행 한 쿼리 :

explain SELECT rid FROM relationship WHERE fromid=78 AND toid=60   

어떤 도움?

EDIT1 :
아래 쿼리를 사용할 때 :

explain SELECT rid FROM relationship WHERE fromid=60 and toid=78 AND is_approved='s'  OR is_approved='f' OR is_approved='t'

내가 볼 USING WHERE대신 이전 메시지의,하지만 난 쿼리 아래를 사용하는 경우 :

explain SELECT rid FROM relationship WHERE fromid=60 and toid=78 AND (is_approved='s'  OR is_approved='f' OR is_approved='t')  

나는 첫번째 impossible ...메시지를 다시 받는다 ! 이 괄호는 여기서 무엇을합니까?

EDIT2 :

CREATE TABLE `relationship` (
 `rid` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `fromid` mediumint(8) unsigned NOT NULL,
 `toid` mediumint(8) unsigned NOT NULL,
 `type` tinyint(3) unsigned NOT NULL,
 `is_approved` char(1) NOT NULL,
 PRIMARY KEY (`rid`),
 UNIQUE KEY `fromid` (`fromid`,`toid`),
 KEY `toid` (`toid`),
 CONSTRAINT `relationship_ibfk_1` FOREIGN KEY (`fromid`) REFERENCES `user` (`uid`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `relationship_ibfk_2` FOREIGN KEY (`toid`) REFERENCES `user` (`uid`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB

EDIT3 : mysql 사이트에서 다음과
같이 말합니다.

const 테이블을 읽은 후 주목할 수없는 곳

MySQL은 모든 const (및 시스템) 테이블을 읽었으며 WHERE 절이 항상 false임을 확인했습니다.

그러나 쿼리에서 원하는 결과를 얻지 만 WHERE부분은 아닙니다 false. 이것을 설명하고 주제에 대해 약간의 설명을 해줄 사람이 있습니까?


무엇을 SELECT COUNT(1) FROM relationship WHERE fromid=78 AND toid=60;반환 합니까 ???
RolandoMySQLDBA

@RolandoMySQLDBA, using index대신 추가됩니다impossible...
ALH

답변:


23

당신은 메시지를 받고있다

const 테이블을 읽은 후 주목할 수없는 곳

이것은 이미 링크 한 페이지에 설명 되어 있습니다.

MySQL은 모든 const(및 system) 테이블 을 읽었 으며 WHERE절이 항상 거짓임을 알았습니다.

const 테이블은 다음과 같이 정의됩니다

테이블에는 최대 하나의 일치하는 행이 있으며 쿼리 시작시 읽습니다. ... 또는 인덱스 const의 모든 부분 을 상수 값 과 비교할 때 사용됩니다 .PRIMARY KEYUNIQUE

당신은이 UNIQUE KEY에를 (fromid,toid). WHERE fromid=78 AND toid=60이 고유 인덱스를 읽으면 쿼리를 충족시킬 수 있습니다. 이 메시지가 표시되면 결과가 반환되지 않아야합니다.

마찬가지로 쿼리 WHERE fromid=60 and toid=78 AND (is_approved='s' OR is_approved='f' OR is_approved='t')는이 인덱스를 사용하여 관심있는 행을 찾을 수 있습니다 (여전히 일치하는 행이 있는지 평가할 잔존 술어가 있음).

다른 검색어가 다릅니다

SELECT rid
FROM   relationship
WHERE  fromid = 60
       AND toid = 78
       AND is_approved = 's'
        OR is_approved = 'f'
        OR is_approved = 't' 

AND보다 우선 순위가 높 Or으므로

SELECT rid
FROM   relationship
WHERE  ( ( fromid = 60 ) AND ( toid = 78 ) AND ( is_approved = 's' ) )
        OR ( is_approved = 'f' )
        OR ( is_approved = 't' ) 

이것은 더 이상 해당 인덱스를 사용할 수 없으며 다른 열의 값이 무엇 이든is_approved IN ('f','t') 관계없이 행 을 반환한다는 점에서 다른 의미를 갖습니다.


그래서 내가 어떻게 예를 들어 말해야한다 : 그것의 경우 fromid=12 AND toid=78다음 여부를 확인 is_approved='f'하거나 is_approved='t'또는is_approved='s'
ALH

1
@ john.locke : 세 번째 질문입니다. WHERE fromid=60 AND toid=78 AND (is_approved='s' OR is_approved='f' OR is_approved='t')다음과 같이 쓸 수도 있습니다 :WHERE fromid=60 AND toid=78 AND ( is_approved IN ('s', 'f', 't') )
ypercubeᵀᴹ

1
정확하게. fromid=60 AND toid=78부품 과 일치하는 행 이 없으므로 추가 점검이 필요하지 않습니다 ( is_approved부품에 대해).
ypercubeᵀᴹ

1
당신은 열 수 없습니다 S 않습니다. 고유 한 제약 조건이 (fromid,toid)있으므로 최대 한도는 확실합니까? 그리고 당신이 말하는 메시지에서 당신이 MySQL을 받고 있다고해서 그것이 심지어 하나 있다고 생각하지 않습니다. 일치 fromid=60하는 행과 일치 toid=78하지만 반드시 동일한 행은 아닌 행이 있습니까?
Martin Smith

1
아마도 이것은 AND-OR혼란 입니다. 어쩌면 당신은 가지고있는 fromid=60모든 행 toid=78과 그다음에 있는 모든 행을 원 's'하거나 'f'또는 t'is_approved 된 행만 유지합니까? 그렇다면 다음 조건을 시도하십시오.WHERE (fromid=60 OR toid=78) AND (is_approved IN ('s', 'f', 't'))
ypercubeᵀᴹ

5

MySql Explain은 제공 한 값을 사용하여 연관된 테이블의 행을 순회합니다. 관련 테이블에없는 상수 / 키 값을 제공하면 MySql Explain이이 오류와 함께 중지됩니다. 연관된 테이블에 존재하는 값을 쿼리하고 Explain 쿼리에 값을 제공하면 모든 것이 예상대로 작동합니다.


3
Impossible WHERE noticed ...오류가 아닙니다. 설명의 일부입니다.
ypercubeᵀᴹ

3

Impossible WHERE noticed after reading const tables 설명 쿼리에서?

이 오류는 기본 키 또는 고유 키인 열에 유효하지 않은 값이 입력되어 발생합니다.

where절 에서 올바른 값으로 시도하십시오 .


0

나는 이것을 늦게 뛰어 들고있다. 그러나 여기에 내가 주목 한 것이 있습니다.

이 쿼리를 수행하고 있었고 항목 열이 고유했습니다.

SELECT `vari-groupid` FROM shop_item_variations_group where `item` = 'itemnu1' limit 1

const 테이블을 읽은 후 불가능한 곳을 알 수 있습니다.

"="를 "like"로 변경하기 만하면 이제 내 색인을 사용하고 있습니다.

SELECT `vari-groupid` FROM shop_item_variations_group where `item` like 'itemnu1' limit 1

=? 와 함께 색인을 사용하지 않았습니까 ?
ypercubeᵀᴹ

그것은 충분히 미쳤지 않았다 .... 단지 const 테이블을 읽은 후 주목할 수없는 곳의 설명에서 이것을 말하고 있었다
RichardW11

예, 그러나 "불가능한 곳"은 일반적으로 좋습니다. 이는 쿼리가 테이블이나 인덱스에서 더 이상 읽을 필요가 없음을 의미합니다. 느 렸어? 그렇지 않다면 전혀 걱정하지 않아도됩니다.
ypercubeᵀᴹ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.