检查空文本字段是否对性能有害?

时间:2012-03-31 03:15:14

标签: mysql

我有游戏服务,我的一些“游戏室”受密码保护。在公开的游戏列表中,我只想获取没有密码的游戏。我的表看起来像:

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”上加上一个索引以获得最佳性能吗?

这完全错了吗?

由于

3 个答案:

答案 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并没有错。

相关问题