我有游戏服务,我的一些“游戏室”受密码保护。在公开的游戏列表中,我只想获取没有密码的游戏。我的表看起来像:
id | gameName | date | password |
---------------------------------
1 foo 123 null
2 grok 456 abc
...
所以我想知道在以下情况下做下面的公共游戏是否正常:
SELECT * FROM games WHERE password != null ORDER BY date LIMIT 50;
(我不知道!= null部分的语法)但是想出类似的东西存在,是否会在性能方面表现不佳?我是否应该添加一个名为“isPublic”的附加列,它只是一个小int,{false,true}的值为{0,1}?然后我可以做:
SELECT * FROM games WHERE isPublic = 1 ORDER BY date LIMIT 50;
我想我必须在“isPublic”上加上一个索引以获得最佳性能吗?
这完全错了吗?
由于
答案 0 :(得分: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/
我看到的唯一问题是语义有点隐藏,但至于性能,你可能会为这个特定问题做一点基准测试。
答案 1 :(得分:0)
不,null是SQL DB中绝对的第一个订单值。没有理由你应该获得任何类型的性能。
话虽这么说,做一个测试是微不足道和有益的,所以这是我的建议。
答案 2 :(得分:0)
据我所知,MySQL并不支持真BOOLEAN
,它只是TINYINT(1)
。来自http://dev.mysql.com/doc/refman/5.0/en/numeric-type-overview.html:
BOOL,BOOLEAN
这些类型是TINYINT(1)的同义词。值为零 假。非零值被认为是真实的。
这样做
SELECT * FROM games WHERE isPublic = 'true'
将是最糟糕的情况,因为你将比较字符串。话虽如此,null
并没有错。