Почему я получаю `Невозможно ГДЕ замечено после прочтения const таблиц` в запросе объяснения?


27

У меня есть уникальный составной ключ, такой как fr (fromid, toid) в таблице, когда я запускаю запрос с объяснением, я получаю следующий результат:

Impossible WHERE noticed after reading const tables`

Запрос, который я выполнил:

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

Любая помощь?

EDIT1:
когда я использую запрос ниже:

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

Я вижу USING WHEREвместо предыдущего сообщения, но когда я использую запрос ниже:

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

Я снова получаю первое impossible ...сообщение! Что эти круглые скобки делают здесь?

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:
Как MySQL сайт говорит:

Невозможно ГДЕ заметил после прочтения const таблиц

MySQL прочитал все const (и системные) таблицы и заметил, что предложение WHERE всегда ложно.

Но в запросе я получаю желаемый результат, а WHEREчасть - нет false. Есть ли кто-то, кто мог бы объяснить это и пролить свет на эту тему?


Что SELECT COUNT(1) FROM relationship WHERE fromid=78 AND toid=60;возвращает ???
RolandoMySQLDBA

@RolandoMySQLDBA, будет using indexвместоimpossible...
ALH

Ответы:


23

Вы получаете сообщение

Невозможно ГДЕ заметил после прочтения const таблиц

Это задокументировано на странице, на которую вы уже ссылались .

MySQL прочитал все constsystem) таблицы и заметил, что WHEREпредложение всегда ложно

const таблицы определены как

Таблица содержит не более одной совпадающей строки, которая читается в начале запроса. ... constиспользуется при сравнении всех частей индекса PRIMARY KEYили UNIQUEс постоянными значениями.

У вас есть UNIQUE KEYна (fromid,toid). Запрос WHERE fromid=78 AND toid=60можно выполнить, прочитав этот уникальный индекс. Из полученного сообщения это не должно возвращать никаких результатов.

Точно так же запрос WHERE fromid=60 and toid=78 AND (is_approved='s' OR is_approved='f' OR is_approved='t')может также использовать этот индекс, чтобы найти интересующую строку (хотя у него все еще есть остаточный предикат, чтобы оценить, какая строка соответствует).

Ваш другой запрос отличается

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

ANDимеет более высокий приоритет, чем Or, так что это так же, как

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

Он больше не может использовать этот индекс и имеет другую семантику в том смысле, что он будет возвращать любые строки is_approved IN ('f','t')независимо от значения в других столбцах.


Так, как я должен сказать, например: если это так, fromid=12 AND toid=78проверьте, если is_approved='f'или is_approved='t'илиis_approved='s'
ALH

1
@ john.locke: Это ваш третий запрос, WHERE fromid=60 AND toid=78 AND (is_approved='s' OR is_approved='f' OR is_approved='t')который также можно записать в виде:WHERE fromid=60 AND toid=78 AND ( is_approved IN ('s', 'f', 't') )
ypercubeᵀᴹ

1
В точку. Поскольку ни одна строка не соответствует fromid=60 AND toid=78детали, поэтому дальнейшая проверка не требуется (для is_approvedдетали).
ypercubeᵀᴹ

1
Вы не можете иметь строки S , что делать. Существует уникальное ограничение, (fromid,toid)так что наверняка будет максимум один? И из сообщения, которое вы говорите, вы получаете MySQL, не думает, что есть даже тот, который делает. Вы имеете в виду, что у вас есть несколько совпадающих строк fromid=60и несколько совпадающих, toid=78но не обязательно одинаковых строк?
Мартин Смит

1
Возможно, это AND-ORпутаница . Может быть, вы хотите, чтобы все строки, которые имеют fromid=60и все строки, которые имеют, toid=78а затем из них, оставляли только те, которые имеют или 's'или 'f'или t'is_approved? Если да, попробуйте это условие:WHERE (fromid=60 OR toid=78) AND (is_approved IN ('s', 'f', 't'))
ypercubeᵀᴹ

5

MySql Explain использует предоставленные вами значения, в буквальном смысле, для обхода строк связанных таблиц. Если вы укажете значение константы / ключа, которого нет в связанной таблице, MySql Explain остановится с этой ошибкой. Просто запросите в соответствующих таблицах значения, которые существуют, и предоставьте их в вашем запросе объяснения, и все будет работать как положено.


3
Impossible WHERE noticed ...это не ошибка Это часть объяснения.
ypercubeᵀᴹ

3

Impossible WHERE noticed after reading const tables в запросе объяснения?

Эта ошибка возникает из-за того, что в столбец введено неверное значение, являющееся либо первичным, либо уникальным ключом.

Попробуйте с правильным значением в whereпредложении.


0

Я прыгаю в это поздно. Но вот что я заметил для себя.

Я делал этот запрос, и столбец элемента был УНИКАЛЬНЫМ.

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

который получил бы невозможное ГДЕ заметил после прочтения const таблиц

Все, что мне нужно было сделать, это изменить "=" на "нравится", и теперь он использует мой индекс.

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

Разве это не использование индекса с =?
ypercubeᵀᴹ

Не достаточно сумасшедший, это не было ... Это было просто сказано это в объяснении Невозможно, ГДЕ заметил после прочтения const таблиц
RichardW11

Да, но это "невозможно ГДЕ" обычно хорошо. означает, что запрос больше не должен читать из таблиц или индексов. Это было медленно? Если нет, вы не должны беспокоиться вообще.
ypercubeᵀᴹ
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.