2012-03-31 4 views
1

私はゲームサービスを持っています、私の "gamerooms"のいくつかはパスワードで保護されています。公開されているゲームのリストでは、パスワードを持っていないゲームを取り出したいと思っています。パフォーマンスのためにヌルテキストフィールドが不正かどうかチェックしていますか?

SELECT * FROM games WHERE password != null ORDER BY date LIMIT 50; 

(私はのための構文を知らない。だから私はそれがOK性能面公共のゲームを見つけるために、次の操作を実行するかどう思ったんだけど

id | gameName | date | password | 
--------------------------------- 
1 foo  123 null 
2 grok  456 abc 
... 

:私のテーブルは次のようになります! = nullの部分)しかし、存在するようなものを考えると、それはパフォーマンスが悪くなるでしょうか?代わりに、代わりに "isPublic"という名前の列を追加する必要があります。この列は、{false、true}の値{0、1}を持つ小さなintです。

SELECT * FROM games WHERE isPublic = 1 ORDER BY date LIMIT 50; 

をし、私はそれから最高のパフォーマンスを得るために「isPublic」にインデックスを置く必要があるだろうと思います。そして、私は何ができますか?

これは完全に間違っていますか?

ありがとうございます。

答えて

1

実際に
SELECT * FROM games WHERE password IS NULL ORDER BY date LIMIT 50; 

、MySQLのは普通の値としてNULLを使用するために最適化されています。私はそれを見http://www.devshed.com/c/a/MySQL/MySQL-Optimization-part-1/4/

唯一の問題は、セマンティクスが得るということです少し隠されていますが、パフォーマンスに関しては、おそらくこの特定の問題について少しベンチマークを行います。

+0

+1:正しい - '!='は実際の値を比較するためのものです。 NULLと比較するには、 'IS NULL'か' IS NOT NULL'を使う必要があります。 –

0

いいえ、nullはSQL DBの絶対的な一次値です。どんなタイプのパフォーマンスヒットにもならない理由はありません。

言われていることは、テストを行うことは些細で有益なことであり、それが私の提案です。あなたは、おそらく罰金だろう

+0

Ok - テストするために、私はmysqlクエリブラウザがあなたにどのくらいの時間クエリを要したのだろうと思っていましたが、それはもう見えません。それを行うには良い方法かどうかわかりませんが、ライブデータで実行することもできます。それは私が推測する私のデータに依存します。 – user291701

0

私が知っている限り、MySQLは真のBOOLEANをサポートしていませんが、それはただTINYINT(1)です。 http://dev.mysql.com/doc/refman/5.0/en/numeric-type-overview.htmlから:

BOOL、BOOLEAN

これらのタイプはTINYINT(1)の同義語です。 0の値は、 とみなされます。ゼロ以外の値は真とみなされます。

だからあなたは文字列を比較することになるので、最悪のケースだろう

SELECT * FROM games WHERE isPublic = 'true' 

ような何かをやって。つまり、nullは何も問題ありません。

関連する問題