Mam unikalny klucz złożony, taki jak fr (fromid, toid) w tabeli, kiedy uruchamiam zapytanie z wyjaśnieniem, otrzymuję następujący wynik:
Impossible WHERE noticed after reading const tables`
Zapytanie, które uruchomiłem:
explain SELECT rid FROM relationship WHERE fromid=78 AND toid=60
Jakaś pomoc?
EDYCJA 1:
Kiedy używam poniższego zapytania:
explain SELECT rid FROM relationship WHERE fromid=60 and toid=78 AND is_approved='s' OR is_approved='f' OR is_approved='t'
Widzę USING WHERE
zamiast poprzedniej wiadomości, ale kiedy używam poniższego zapytania:
explain SELECT rid FROM relationship WHERE fromid=60 and toid=78 AND (is_approved='s' OR is_approved='f' OR is_approved='t')
Ponownie otrzymuję pierwszą impossible ...
wiadomość! Co robią te nawiasy?
EDYCJA 2:
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
EDYCJA 3:
Jak mówią witryny mysql:
Niemożliwe GDZIE zauważono po odczytaniu tabel stałych
MySQL odczytał wszystkie tabele const (i systemowe) i zauważył, że klauzula WHERE jest zawsze fałszywa.
Ale w zapytaniu otrzymuję wynik, którego chcę, WHERE
część nie false
. Czy jest ktoś, kto mógłby to wyjaśnić i rzucić nieco światła na ten temat?
SELECT COUNT(1) FROM relationship WHERE fromid=78 AND toid=60;
zwraca?using index
dodatkowe zamiastimpossible...
Odpowiedzi:
Otrzymujesz wiadomość
Jest to udokumentowane na stronie, którą już dowiązałeś .
const
tabele są zdefiniowane jakoMasz
UNIQUE KEY
na(fromid,toid)
. ZapytanieWHERE fromid=78 AND toid=60
można spełnić, czytając ten unikalny indeks. Z otrzymanej wiadomości nie należy zwracać żadnych wyników.Podobnie zapytanie
WHERE fromid=60 and toid=78 AND (is_approved='s' OR is_approved='f' OR is_approved='t')
może również użyć tego indeksu, aby zlokalizować interesujący wiersz (chociaż nadal ma rezydualny predykat do oceny, czy dowolny wiersz jest zgodny).Twoje inne zapytanie jest inne
AND
ma wyższy priorytet niżOr
, więc jest to to samo coNie może już używać tego indeksu i ma inną semantykę, ponieważ zwróci wszystkie wiersze,
is_approved IN ('f','t')
niezależnie od wartości w innych kolumnach.źródło
fromid=12 AND toid=78
to sprawdź,is_approved='f'
czyis_approved='t'
lubis_approved='s'
WHERE fromid=60 AND toid=78 AND (is_approved='s' OR is_approved='f' OR is_approved='t')
można je również zapisać jako:WHERE fromid=60 AND toid=78 AND ( is_approved IN ('s', 'f', 't') )
fromid=60 AND toid=78
części, więc nie jest konieczne dalsze sprawdzanie (dlais_approved
części).(fromid,toid)
więc na pewno byłoby ich maksymalnie jedno? A z wiadomości, którą mówisz, że otrzymujesz MySQL, nie sądzisz, że istnieje nawet jedna, która to robi. Czy masz na myśli, że masz kilka pasującychfromid=60
wierszy i kilka pasujących wierszy,toid=78
ale niekoniecznie te same wiersze?AND-OR
zamieszanie . Może chcesz wszystkie wiersze, które mająfromid=60
i wszystkie wiersze, które majątoid=78
, a następnie od tych, zachować tylko te, które mają albo's'
albo'f'
albot'
is_approved? Jeśli tak, wypróbuj ten warunek:WHERE (fromid=60 OR toid=78) AND (is_approved IN ('s', 'f', 't'))
MySql Explain wykorzystuje podane wartości dosłownie do przechodzenia między wierszami powiązanych tabel. Jeśli podasz stałą wartość / klucz, której nie ma w powiązanej tabeli, MySql Explain zatrzyma się z tym błędem. Po prostu zapytaj o powiązane tabele o wartości, które istnieją i podaj te w zapytaniu wyjaśniającym, a wszystko będzie działać zgodnie z oczekiwaniami.
źródło
Impossible WHERE noticed ...
nie jest błędem. To część wyjaśnienia.Impossible WHERE noticed after reading const tables
w wyjaśnieniu zapytania?Ten błąd występuje z powodu umieszczenia niepoprawnej wartości w kolumnie, która jest albo kluczem podstawowym, albo kluczem unikatowym.
Spróbuj z poprawną wartością w
where
klauzuli.źródło
Wskakuję tak późno. Ale oto, co zauważyłem dla siebie.
Robiłem to zapytanie, a kolumna elementu była UNIKALNA.
które otrzymałoby Niemożliwe GDZIE zauważyłem po przeczytaniu tabel stałych
Wszystko, co musiałem zrobić, to zmienić „=” na „lubić”, a teraz używa mojego indeksu.
źródło
=
?