web-dev-qa-db-fra.com

Pourquoi est-ce que j'obtiens «Impossible O noticed je l'ai remarqué après avoir lu les tables de const» dans la requête d'explication?

J'ai une clé composée unique comme fr (fromid, toid) dans la table, lorsque j'exécute la requête avec expliquer, j'obtiens le résultat suivant:

Impossible WHERE noticed after reading const tables`

La requête que j'ai exécutée:

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

De l'aide?

EDIT1:
Lorsque j'utilise la requête ci-dessous:

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

Je vois USING WHERE au lieu du message précédent, mais lorsque j'utilise la requête ci-dessous:

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

Je reçois à nouveau le premier impossible ... message! Que font ces parenthèses ici?

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:
Comme le dit le site mysql:

Impossible O noticed remarqué après avoir lu les tables const

MySQL a lu toutes les tables const (et système) et remarque que la clause WHERE est toujours fausse.

Mais dans la requête j'obtiens le résultat que je veux, la partie WHERE n'est pas false. Y a-t-il quelqu'un qui pourrait expliquer cela et faire la lumière sur le sujet?

27
ALH

Vous recevez le message

Impossible O noticed remarqué après avoir lu les tables const

Ceci est documenté dans la page que vous avez déjà liée .

MySQL a lu toutes les tables const (et system) et remarque que la clause WHERE est toujours fausse

const les tables sont définies comme

La table a au plus une ligne correspondante, qui est lue au début de la requête. ... const est utilisé lorsque vous comparez toutes les parties d'un index PRIMARY KEY ou UNIQUE à des valeurs constantes.

Vous avez un UNIQUE KEY Sur (fromid,toid). La requête sur WHERE fromid=78 AND toid=60 Peut être satisfaite en lisant cet index unique. Du message que vous obtenez, cela ne doit retourner aucun résultat.

De même, la requête WHERE fromid=60 and toid=78 AND (is_approved='s' OR is_approved='f' OR is_approved='t') peut également utiliser cet index pour localiser la ligne d'intérêt (bien qu'elle ait toujours un prédicat résiduel à évaluer si une ligne devait correspondre).

Votre autre requête est différente

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

AND a une priorité plus élevée que Or, c'est donc la même chose que

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

Cela ne peut plus utiliser cet index et a une sémantique différente en ce qu'il retournera toutes les lignes is_approved IN ('f','t') quelles que soient les valeurs les autres colonnes le sont.

23
Martin Smith

MySql Explain utilise littéralement les valeurs que vous fournissez pour parcourir les lignes des tables associées. Si vous fournissez une valeur constante/clé qui ne figure pas dans la table associée, MySql Explain s'arrête avec cette erreur. Recherchez simplement les tables associées pour les valeurs qui existent et fournissez-les dans votre requête Explain et tout fonctionnera comme prévu.

5
grwww

Impossible WHERE noticed after reading const tables dans la requête d'explication?

Cette erreur se produit en raison d'une valeur non valide placée sur une colonne qui sont soit la clé primaire soit la clé unique.

Essayez avec une valeur correcte dans la clause where.

3
Rjnish Kumar

Je saute trop tard. Mais voici ce que j'ai remarqué pour moi.

Je faisais cette requête et la colonne de l'article était UNIQUE.

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

qui obtiendrait le Impossible O noticed remarqué après avoir lu les tables const

Tout ce que j'avais à faire était de changer "=" en "j'aime" et il utilise maintenant mon index.

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