2008年8月19日火曜日

SELECT WHERE の話

MySQLで、いままで気にしていなかったのですが相関問い合わせを使って初めて気がついたこと。

たとえば、

SELECT * FROM 記事 WHERE 記事.id=2122

のようなSQLを実行したとき、データベースサーバー側では、
2122をハッシュなどで記事.idから高速検索するという考え方よりも、
実際の動作で考えると、
記事.idを順に最初から調べていき、

記事.id=2122が成り立つものを返す。

というのも
副問い合わせでツリー構造になっている掲示板で考えたとき、
親記事でコメントのついていない記事を検索するには
つぎのような副問い合わせで検索できます。

SELECT * FROM 記事 as A
WHERE 0=(
SELECT COUNT(*) FROM 記事 AS B
WHERE 記事.id = B.parentid
)

つまりWHERE 0=... は条件文としてしか評価していないのです。


ps.
実際にはオプティマイザがあるので、

WHERE 記事.id=2122

はハッシュなんでしょうけどね。

0 件のコメント: