web-dev-qa-db-ja.com

Explainクエリで「constテーブルを読んだ後、不可能なWHEREに気づいた」と表示されるのはなぜですか?

テーブルにfr(fromid、toid)のような一意の複合キーがあり、explainを指定してクエリを実行すると、次の結果が得られます。

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テーブルを読んだ後、不可能なWHEREに気付きました

MySQLはすべてのconst(およびシステム)テーブルを読み取り、WHERE句が常にfalseであることに注意してください。

しかし、クエリで必要な結果が得られますが、WHEREの部分はfalseではありません。これを説明して、この問題に光を当てる人はいますか?

27
ALH

あなたはメッセージを受け取っています

Constテーブルを読んだ後、不可能なWHEREに気付きました

これは すでにリンクしたページ に記載されています。

MySQLはすべてのconst(およびsystem)テーブルを読み取り、WHERE句は常にfalseであることに注意してください

constテーブルは次のように定義されます

テーブルには最大1つの一致する行があり、クエリの開始時に読み込まれます。 ... 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' 
_

ANDOrよりも優先順位が高いため、これは

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

これはもはやそのインデックスを使用できず、any行を返すという意味で異なるセマンティクスを持っています。ここで、is_approved IN ('f','t')の値は他の列があります。

23
Martin Smith

MySql Explainは、提供された値を文字通り使用して、関連付けられたテーブルの行をトラバースします。関連するテーブルにない定数/キー値を指定すると、MySql Explainはこのエラーで停止します。存在する値について関連テーブルにクエリを実行し、Explainクエリでそれらを提供するだけで、すべてが期待どおりに機能します。

5
grwww

Impossible WHERE noticed after reading const tables説明クエリで?

このエラーは、主キーまたは一意キーである列に無効な値が設定されているために発生します。

where句の正しい値で試してください。

3
Rjnish Kumar

私はこれから遅くまで飛び込みます。しかし、ここに私が気づいたことがあります。

このクエリを実行していたところ、アイテム列は一意でした。

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

constテーブルを読んだ後に不可能なWHEREに気づく

私がしなければならなかったすべては「=」を「好き」に変更し、それは今私のインデックスを使用しています。

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