Eu tenho uma chave composta exclusiva como fr (fromid, toid) na tabela. Quando executo a consulta com o explicador, obtenho o seguinte resultado:
Impossible WHERE noticed after reading const tables`
A consulta que eu executei:
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 em USING WHERE
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')
Recebo novamente 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 após a leitura de tabelas const
O MySQL leu todas as tabelas const (e system) e percebe que a cláusula WHERE é sempre falsa.
Mas, na consulta, obtenho o resultado desejado, a WHERE
parte não é false
. Existe alguém que possa explicar isso e lançar alguma luz sobre o assunto?
SELECT COUNT(1) FROM relationship WHERE fromid=78 AND toid=60;
retorna ???using index
extra em vez deimpossible...
Respostas:
Você está recebendo a mensagem
Isso está documentado na página que você já vinculou .
const
tabelas são definidas comoVocê tem um
UNIQUE KEY
on(fromid,toid)
. A consulta emWHERE fromid=78 AND toid=60
pode ser atendida lendo este índice exclusivo. Na 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 alguma linha corresponder).Sua outra consulta é diferente
AND
tem uma precedência mais alta queOr
, portanto, é o mesmo queIsso não pode mais usar esse índice e possui semântica diferente, pois retornará todas as linhas onde,
is_approved IN ('f','t')
independentemente de quais sejam os valores nas outras colunas.fonte
fromid=12 AND toid=78
então verifique seis_approved='f'
ouis_approved='t'
ouis_approved='s'
WHERE fromid=60 AND toid=78 AND (is_approved='s' OR is_approved='f' OR is_approved='t')
o que também pode ser escrita como:WHERE fromid=60 AND toid=78 AND ( is_approved IN ('s', 'f', 't') )
fromid=60 AND toid=78
peça, não é necessária nenhuma verificação adicional (para ais_approved
peça).(fromid,toid)
para que haja um máximo de uma, com certeza? E a partir da mensagem que você diz que está obtendo o MySQL, não pensa que exista mesmo. Você quer dizer que você tem algumas linhas correspondentesfromid=60
e algumas linhas correspondentes,toid=78
mas não necessariamente as mesmas linhas?AND-OR
confusão . Talvez você queira que todas as linhas que possuemfromid=60
e todas as linhas que possuemtoid=78
e, a partir delas , mantenham apenas aquelas que possuem's'
ou são'f'
ou sãot'
aprovadas? Se sim, tente esta condição:WHERE (fromid=60 OR toid=78) AND (is_approved IN ('s', 'f', 't'))
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 está na tabela associada, o MySql Explain irá parar com este erro. Simplesmente consulte as tabelas associadas quanto aos valores existentes e forneça-os na consulta Explain, e tudo funcionará conforme o esperado.
fonte
Impossible WHERE noticed ...
não é um erro. Faz parte da explicação.Impossible WHERE noticed after reading const tables
em explicar consulta?Este erro ocorre devido ao valor inválido ser colocado em uma coluna que é chave primária ou chave exclusiva.
Tente com um valor correto na
where
cláusula.fonte
Estou pulando até tarde. Mas aqui está o que eu notei para mim.
Eu estava fazendo essa consulta e a coluna do item era ÚNICA.
que obteria o Impossível WHERE notado depois de ler as tabelas const
Tudo que eu precisava fazer era mudar "=" para "curtir" e agora está usando meu índice.
fonte
=
?