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'
Ich sehe 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 ...
Nachricht! 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 sagt:
Unmöglich, wo nach dem Lesen von const-Tabellen bemerkt
MySQL hat alle const-Tabellen (und Systemtabellen) gelesen und festgestellt, dass die WHERE-Klausel immer falsch ist.
Aber bei der Abfrage bekomme ich das gewünschte Ergebnis, das WHERE
Teil geht nicht false
. Gibt es jemanden, der dies erklären und Licht ins Dunkel bringen könnte?
SELECT COUNT(1) FROM relationship WHERE fromid=78 AND toid=60;
zurück ???using index
in extra stattimpossible...
Antworten:
Sie erhalten die Nachricht
Dies ist auf der Seite dokumentiert, die Sie bereits verlinkt haben .
const
Tabellen sind definiert alsDu hast einen
UNIQUE KEY
an(fromid,toid)
. Die Abfrage fürWHERE fromid=78 AND toid=60
kann durch Lesen dieses eindeutigen Indexes erfüllt werden. Von der Nachricht, die Sie erhalten, dürfen keine Ergebnisse 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 immer noch ein verbleibendes Prädikat hat, das ausgewertet werden muss, wenn eine Zeile übereinstimmt).Ihre andere Frage ist anders
AND
hat eine höhere Priorität alsOr
, dies ist also dasselbe wieDieser Index kann nicht mehr verwendet werden und hat eine andere Semantik, da er alle Zeilen zurückgibt,
is_approved IN ('f','t')
unabhängig von den Werten in den anderen Spalten.quelle
fromid=12 AND toid=78
dann überprüfen, obis_approved='f'
oderis_approved='t'
oderis_approved='s'
WHERE fromid=60 AND toid=78 AND (is_approved='s' OR is_approved='f' OR is_approved='t')
die auch geschrieben werden kann als:WHERE fromid=60 AND toid=78 AND ( is_approved IN ('s', 'f', 't') )
fromid=60 AND toid=78
Teil übereinstimmt , ist keine weitere Prüfung (für dasis_approved
Teil) erforderlich .(fromid,toid)
sodass es mit Sicherheit maximal eine geben würde. Und aus der Nachricht, die Sie sagen, dass Sie MySQL erhalten, geht nicht hervor, dass es überhaupt eine gibt, die dies tut. Meinen Sie damit, dass Sie einige übereinstimmende Zeilenfromid=60
und einige übereinstimmende Zeilen haben,toid=78
aber nicht unbedingt dieselben Zeilen?AND-OR
Verwirrung . Vielleicht möchten Sie alle Zeilen, die habenfromid=60
und alle Zeilen, die habentoid=78
und von denen dann nur diejenigen behalten, die entweder's'
oder'f'
odert'
is_approved haben? Wenn ja, probieren Sie diese Bedingung aus:WHERE (fromid=60 OR toid=78) AND (is_approved IN ('s', 'f', 't'))
MySql Explain verwendet die von Ihnen angegebenen Werte, um Zeilen der zugeordneten Tabellen zu durchlaufen. Wenn Sie eine Konstante / einen Schlüsselwert angeben, der nicht in der zugehörigen Tabelle enthalten ist, wird MySql Explain mit diesem Fehler beendet. Fragen Sie einfach die zugeordneten Tabellen nach vorhandenen Werten ab und geben Sie diese in Ihrer Erklärungsabfrage an, und alles funktioniert wie erwartet.
quelle
Impossible WHERE noticed ...
ist kein Fehler. Es ist Teil der Erklärung.Impossible WHERE noticed after reading const tables
in EXPLAIN-Abfrage?Dieser Fehler tritt auf, weil in eine Spalte ein ungültiger Wert eingegeben wurde, der entweder ein Primärschlüssel oder ein eindeutiger Schlüssel ist.
Versuchen Sie es mit einem korrekten Wert in der
where
Klausel.quelle
Ich bin so spät dran. Aber hier ist, was mir aufgefallen ist.
Ich habe diese Abfrage durchgeführt und die Elementspalte war EINZIGARTIG.
Das würde das Unmögliche bewirken, wo es nach dem Lesen von const-Tabellen auffällt
Ich musste nur "=" in "like" ändern und jetzt wird mein Index verwendet.
quelle
=
?