2012-03-31 22 views
1

我有一個遊戲服務,我的一些「遊戲室」有密碼保護。在公開的遊戲列表中,我只想獲取沒有密碼的遊戲。我的表如下所示:正在檢查對性能不利的空文本字段?

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值,{0,1}爲{false,true}?然後我可以這樣做:

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'。 – 2012-03-31 03:44:41

0

沒有,空在SQL DB中的絕對第一順序值。沒有理由讓你獲得任何類型的表現。

這就是說,做一個測試將是微不足道的和有益的,所以這是我的建議。

+0

好的 - 爲了測試,我認爲mysql查詢瀏覽器應該是多久查詢花了(但不再看到它)。我不知道這是否是一種很好的方法,但我可以在實時數據上運行它。這一切都取決於我的數據,我猜。 – user291701 2012-04-01 05:14:46

0

據我所知MySQL不支持真正的BOOLEAN,它只是一個TINYINT(1)。從http://dev.mysql.com/doc/refman/5.0/en/numeric-type-overview.html

BOOL,BOOLEAN

這些類型是TINYINT同義詞(1)。零值被認爲是 false。非零值被認爲是真實的。

所以做這樣的事情

SELECT * FROM games WHERE isPublic = 'true' 

將是最壞的情況,因爲你會比較字符串。話雖如此,null沒有錯。