Почему я получаю `Невозможно ГДЕ замечено после прочтения 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 прочитал все const(и system) таблицы и заметил, что 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.