it-swarm.com.de

Warum wird mir in der EXPLAIN-Abfrage "Unmöglich, WO nach dem Lesen von Konstantentabellen" aufgefallen?

Ich habe einen eindeutigen zusammengesetzten Schlüssel wie fr (fromid, toid) in der Tabelle. Wenn ich die Abfrage mit EXPLAIN ausführe, erhalte ich das folgende Ergebnis:

Impossible WHERE noticed after reading const tables`

Die Abfrage, die ich ausgeführt habe:

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

Irgendeine Hilfe?

EDIT1:
Wenn ich die folgende Abfrage verwende:

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

Aha USING WHERE anstelle der vorherigen Nachricht, aber wenn ich die folgende Abfrage verwende:

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

Ich bekomme wieder das erste impossible ... Botschaft! Was machen diese Klammern hier?

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:
Wie MySQL-Site sagen :

Unmöglich WO nach dem Lesen von const-Tabellen bemerkt

MySQL hat alle const- (und system-) Tabellen gelesen und festgestellt, dass die WHERE-Klausel immer falsch ist.

Aber in der Abfrage erhalte ich das gewünschte Ergebnis, der Teil WHERE ist nicht false. Gibt es jemanden, der dies erklären und Licht in das Thema bringen könnte?

27
ALH

Sie erhalten die Nachricht

Unmöglich, WO nach dem Lesen von const-Tabellen bemerkt

Dies ist dokumentiert in der Seite, die Sie bereits verlinkt haben .

MySQL hat alle const (und system) Tabellen gelesen und festgestellt, dass die WHERE -Klausel immer falsch ist

const Tabellen sind definiert als

Die Tabelle enthält höchstens eine übereinstimmende Zeile, die zu Beginn der Abfrage gelesen wird. ... const wird verwendet, wenn Sie alle Teile eines PRIMARY KEY - oder UNIQUE -Index mit konstanten Werten vergleichen.

Sie haben einen UNIQUE KEY Auf (fromid,toid). Die Abfrage zu WHERE fromid=78 AND toid=60 Kann durch Lesen dieses eindeutigen Index erfüllt werden. Aus der Nachricht, die Sie erhalten, darf kein Ergebnis zurückgegeben werden.

In ähnlicher Weise kann die Abfrage WHERE fromid=60 and toid=78 AND (is_approved='s' OR is_approved='f' OR is_approved='t') diesen Index auch verwenden, um die interessierende Zeile zu lokalisieren (obwohl sie noch ein Restprädikat hat, das ausgewertet werden muss, wenn eine Zeile übereinstimmt).

Ihre andere Anfrage ist anders

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

AND hat eine höhere Priorität als Or, daher ist dies dasselbe wie

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

Dieser Index kann nicht mehr verwendet werden und hat eine andere Semantik, da er any Zeilen zurückgibt, wobei is_approved IN ('f','t') unabhängig von den Werten in den anderen Spalten.

23
Martin Smith

MySql Explain verwendet die von Ihnen angegebenen Werte buchstäblich, um Zeilen der zugehörigen Tabellen zu durchlaufen. Wenn Sie einen Konstanten-/Schlüsselwert angeben, der nicht in der zugehörigen Tabelle enthalten ist, wird MySql Explain mit diesem Fehler beendet. Fragen Sie einfach die zugehörigen Tabellen nach vorhandenen Werten ab und geben Sie diese in Ihrer Explain-Abfrage an. Alles funktioniert wie erwartet.

5
grwww

Impossible WHERE noticed after reading const tables in Abfrage erklären?

Dieser Fehler tritt auf, weil ein ungültiger Wert in eine Spalte eingefügt wird, die entweder ein Primärschlüssel oder ein eindeutiger Schlüssel ist.

Versuchen Sie es mit einem korrekten Wert in der Klausel where.

3
Rjnish Kumar

Ich springe so spät hinein. Aber hier ist, was ich für mich bemerkt habe.

Ich habe diese Abfrage durchgeführt und die Elementspalte war EINZIGARTIG.

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

das würde das Unmögliche bekommen, WO nach dem Lesen von const-Tabellen bemerkt

Alles was ich tun musste war "=" in "Gefällt mir" zu ändern und jetzt wird mein Index verwendet.

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