woshidan's loose leaf

ぼんやり勉強しています。

Impossible WHERE noticed after reading const tables

Explainの結果の中に見かけない出力を見つけたので調べました。

d.hatena.ne.jp

↑の記事によると、「ユニークキーを使って絞り込んだ後、データが見つからなかった場合に発生する」Extraのメッセージらしいです。

MySQLのドキュメントによりますと、

MySQL :: MySQL 5.6 リファレンスマニュアル :: 8.8.2 EXPLAIN 出力フォーマット

仕事で使ってるのが5.7でなくてすみません...。さて、上記のリファレンスマニュアルによりますと、

Impossible WHERE noticed after reading const tables MySQL はすべての const (および system) テーブルを読み取り、WHERE 句が常に false であることを通知します。

ということらしい。ところで、constテーブルって何ということで、MySQLのリファレンスマニュアルをまためくると、

const

テーブルには、一致するレコードが最大で 1 つあり、クエリーの開始時に読み取られます。行が 1 つしかないため、この行のカラムの値は、オプティマイザの残りによって定数とみなされることがあります。const テーブルは、1 回しか読み取られないため、非常に高速です。

const は PRIMARY KEY または UNIQUE インデックスのすべてのパートを定数値と比較する場合に使用されます。次のクエリーでは、tbl_name は const テーブルとして使用できます。

SELECT * FROM tbl_name WHERE primary_key=1;

SELECT * FROM tbl_name
  WHERE primary_key_part1=1 AND primary_key_part2=2;

ということで、PRYMARY_KEYやUNIQUEインデックスに指定した列からできているテーブルみたいなもの(それをindexと...(ry)なんだと思います。

それで、くだんのメッセージは、インデックスの列について、全部スキャンしたけど、インデックスの列の時点で全部falseだったので、これ以上WHEREを走らせることはできないよ、と言われているみたいです。