2012-03-31 11 views
1

Ich habe einen Spieleservice, einige meiner "Spielräume" sind passwortgeschützt. In der öffentlichen Auflistung von Spielen möchte ich nur Spiele holen, die kein Passwort haben. Meine Tabelle wie folgt aussieht:Wird nach einem ungültigen Textfeld gesucht, das die Leistung beeinträchtigt?

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

Also ich frage mich, ob es in Ordnung, Performance-weise ist folgendes zu tun öffentliche Spiele zu finden:

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

(ich weiß nicht, die Syntax für die! = Null-Teil), aber etwas Ähnliches zu finden, wird das in Bezug auf die Leistung schlecht sein? Soll ich stattdessen eine zusätzliche Spalte namens "isPublic" hinzufügen, die nur ein kleines int mit den Werten {0, 1} für {false, true} ist? Dann könnte ich tun:

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

und ich denke, ich muss einen Index setzen würde auf „IsPublic“, um die beste Leistung aus ihm heraus?

Ganz falsch daran?

Dank

Antwort

1

Sie würden wahrscheinlich in Ordnung sein mit:

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

In der Tat ist MySQL für die Verwendung von NULL als nur einen normalen Wert optimiert: http://www.devshed.com/c/a/MySQL/MySQL-Optimization-part-1/4/

Das einzige Problem, das ich mit, dass zu sehen ist, dass die Semantik erhalten ein wenig versteckt, aber in Bezug auf die Leistung, würden Sie wahrscheinlich tun, ein wenig Benchmark für dieses spezielle Problem.

+0

+1: Korrekt - '! =' Ist für den Istwertvergleich. Um mit NULL zu vergleichen, müssen Sie 'IS NULL' oder' IS NOT NULL' verwenden. –

0

Nein, ist null ein absolut erster Wert, um in SQL DBs. Es gibt keinen Grund, dass Sie irgendeine Art von Performance-Hit bekommen sollten.

Das gesagt, es wäre trivial und lehrreich, einen Test zu machen, also ist das mein Vorschlag.

+0

Ok - zu testen, dachte ich mysql Query Browser sollten Sie, wie lange eine Abfrage dauerte (aber nicht mehr sehen). Ich weiß nicht, ob das ein guter Weg ist, aber ich kann es auch mit Live-Daten machen. Alles hängt von meinen Daten ab, denke ich. – user291701

0

Soweit ich weiß, MySQL unterstützt nicht True BOOLEAN, es ist nur ein TINYINT(1). Von http://dev.mysql.com/doc/refman/5.0/en/numeric-type-overview.html:

BOOL, BOOLEAN

Diese Typen sind Synonyme für TINYINT (1). Ein Wert von Null wird als false betrachtet. Werte ungleich Null werden als wahr betrachtet.

So etwas zu tun, wie

SELECT * FROM games WHERE isPublic = 'true' 

der schlimmste Fall wäre, weil Sie Strings vergleichen würde. Davon abgesehen ist nichts falsch mit null.

Verwandte Themen