Eu tenho uma chave composta exclusiva como fr(fromid,toid) na tabela, quando executo a consulta com explicação recebo o seguinte resultado:
Impossible WHERE noticed after reading const tables`
A consulta que fiz:
explain SELECT rid FROM relationship WHERE fromid=78 AND toid=60
Qualquer ajuda?
EDIT1:
Quando eu uso a consulta abaixo:
explain SELECT rid FROM relationship WHERE fromid=60 and toid=78 AND is_approved='s' OR is_approved='f' OR is_approved='t'
Eu vejo USING WHERE
em vez da mensagem anterior, mas quando uso a consulta abaixo:
explain SELECT rid FROM relationship WHERE fromid=60 and toid=78 AND (is_approved='s' OR is_approved='f' OR is_approved='t')
Eu novamente recebo a primeira impossible ...
mensagem! O que esses parênteses fazem aqui?
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:
Como o site mysql diz:
Impossível ONDE notado depois de ler as tabelas const
O MySQL leu todas as tabelas const (e do sistema) e notou que a cláusula WHERE é sempre falsa.
Mas na consulta recebo o resultado que quero, a WHERE
parte não é false
. Existe alguém que poderia explicar isso e lançar alguma luz sobre o assunto?
Você está recebendo a mensagem
Isso está documentado na página que você já vinculou .
const
tabelas são definidas comoVocê tem
UNIQUE KEY
um(fromid,toid)
. A consultaWHERE fromid=78 AND toid=60
pode ser satisfeita lendo este índice exclusivo. A partir da mensagem que você está recebendo, isso não deve retornar resultados.Da mesma forma, a consulta
WHERE fromid=60 and toid=78 AND (is_approved='s' OR is_approved='f' OR is_approved='t')
também pode usar esse índice para localizar a linha de interesse (embora ainda tenha um predicado residual para avaliar se qualquer linha corresponder).Sua outra consulta é diferente
AND
tem uma precedência maior queOr
, então isso é o mesmo queIsso não pode mais usar esse índice e tem semântica diferente, pois retornará todas as linhas ,
is_approved IN ('f','t')
independentemente de quais sejam os valores nas outras colunas.O MySql Explain usa os valores que você fornece, literalmente, para percorrer as linhas das tabelas associadas. Se você fornecer um valor constante/chave que não esteja na tabela associada, o MySql Explain parará com esse erro. Basta consultar a(s) tabela(s) associada(s) em busca de valores que existam e fornecê-los em sua consulta Explicar e tudo funcionará conforme o esperado.
Impossible WHERE noticed after reading const tables
em explicar a consulta?Este erro ocorre devido ao valor inválido sendo colocado em uma coluna que é chave primária ou chave exclusiva.
Tente com um valor correto na
where
cláusula .Estou entrando nisso tarde. Mas aqui está o que eu notei para mim.
Eu estava fazendo essa consulta e a coluna do item era ÚNICA.
o que faria com que o Impossible WHERE fosse notado depois de ler as tabelas const
Tudo o que tive que fazer foi mudar "=" para "like" e agora está usando meu index.