sql abfrage performance

CurryWorld
Hallo

also einmal hätte ich die Datenbankstruktur:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
CREATE TABLE `kalender` (
`id` smallint(10) NOT NULL auto_increment,
`was` varchar(255) NOT NULL default '',
`wo` varchar(255) NOT NULL default '',
`wann` time NOT NULL,
`offen` enum('0','1') NOT NULL default '1',
`kommentar` text NOT NULL,
`tag` smallint(2) NOT NULL default '0',
`monat` smallint(2) NOT NULL default '0',
UNIQUE KEY `id` (`id`)
) 


abfrage:
code:
1:
2:
3:
4:
5:
6:
7:
SELECT id, was, wo, wann, monat, tag
FROM `kalender`
WHERE offen = '1'
AND monat = '6'
AND tag >= '19'
AND tag <= '22'


und einmal:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
CREATE TABLE `kalender` (
`id` smallint(10) NOT NULL auto_increment,
`was` varchar(255) NOT NULL default '',
`wo` varchar(255) NOT NULL default '',
`offen` enum('0','1') NOT NULL default '1',
`kommentar` text NOT NULL,
`datum` datetime NOT NULL,
UNIQUE KEY `id` (`id`)
) 



abfrage:

code:
1:
2:
3:
4:
5:
6:
7:
SELECT id, was, wo, concat_ws( ':', Hour( datum ) , minute( datum ) ) AS wann, day( datum ) AS tag, month( datum ) AS monat
FROM `kalender`
WHERE offen = '1'
AND month( datum ) = '6'
AND day( datum ) >= '19'
AND day( datum ) <= '22'



Was würdet ihr bevorzugen. Gibt es irgendwelche Vorteile der einen Variante gegenüber der anderen? Wie sieht das mit Geschwindigkeit und Speicherplatz aus?

Vielen Dank für eure Antworten
xundy
Also es ist sicher sinvoller die Uhrzeit nach dem auslesen per php zu zerlegen ausserdem wenn du eh alle felder abfragst kannste auch gleich * anstelle der Soaltennamen beutzen, hat zwar nix mit der Performance zu tun spart aber tippselarbeit Augenzwinkern

mfg
SvPe
Zitat:
Original von xundy
Also es ist sicher sinvoller die Uhrzeit nach dem auslesen per php zu zerlegen ausserdem wenn du eh alle felder abfragst kannste auch gleich * anstelle der Soaltennamen beutzen, hat zwar nix mit der Performance zu tun spart aber tippselarbeit Augenzwinkern

mfg


Hört bitte nicht auf xundy und verwende weiterhin SELECT feldname1, ..., feldnamex.
Wenn irgendwann Felder zu der Tabelle hinzugefügt werden werden diese dann zusätzlich geholt und nicht gebraucht.
CurryWorld
Zitat:
Original von SvPe
Zitat:
Original von xundy
Also es ist sicher sinvoller die Uhrzeit nach dem auslesen per php zu zerlegen ausserdem wenn du eh alle felder abfragst kannste auch gleich * anstelle der Soaltennamen beutzen, hat zwar nix mit der Performance zu tun spart aber tippselarbeit Augenzwinkern

mfg


Hört bitte nicht auf xundy und verwende weiterhin SELECT feldname1, ..., feldnamex.
Wenn irgendwann Felder zu der Tabelle hinzugefügt werden werden diese dann zusätzlich geholt und nicht gebraucht.


Nee mach ich auch nicht. Hab schon des öfteren wo anders schon gelesen, dass * nicht so gut sein soll. Habe mal einen kleinen Benchmark mit 1000 Durchläufen gemacht und beide sind ungefähr gleich schnell, also werde ich die alte Variante behalten, dann brauch ich das Script nicht ändern, es sei den es spricht noch irgendetwas dagegen smile
Shr522
Anstatt drei Abfragen per AND zu verknüpfen würde ich lieber eine direkt nach dem Datum machen oO
Ich bevorzuge die zweite Abfrage.
Du kannst ja dort auch noch per sql das Datum formatieren lassen, was ich auch angenehm fände...
Edit: Außerdem - wenn du dann nach dem Datum suchst, kannst du hervorragend einen Indexwert für die Spalte anlegen...
CurryWorld
Zitat:
Original von Shr522
Anstatt drei Abfragen per AND zu verknüpfen würde ich lieber eine direkt nach dem Datum machen oO


Das würde doch nicht Funktionieren, da der gesuchte Tag ja in einem Zeitraum von drei Tagen liegt. Es sei den es gibt irgendwas was ich vergessen habe zu beachten. Das mit dem Datum formatieren mache ich doch schon oder meinst du etwas anderes?
Shr522
Liegen die Tage immer im gleichen Monat? ^^
Ansonsten würde ich mir mal die Funktion Datediff ansehen...
BreiteSeite
Zitat:
Original von xundy
ausserdem wenn du eh alle felder abfragst kannste auch gleich * anstelle der Soaltennamen beutzen, hat zwar nix mit der Performance zu tun



... Doch hat es. Augenzwinkern

» http://www.php-faq.de/q/q-sql-select.html
xundy
Zitat:
Original von BreiteSeite
Zitat:
Original von xundy
ausserdem wenn du eh alle felder abfragst kannste auch gleich * anstelle der Soaltennamen beutzen, hat zwar nix mit der Performance zu tun



... Doch hat es. Augenzwinkern

» http://www.php-faq.de/q/q-sql-select.html


Hat es nicht, wenn schon dann rihtig lesen, meine Aussage war wenn er alle felder abfragt hat es auf die Performance keinen Einfluß, sollten später Felder hinzukommen diese aber in der Abfrage nicht benötigt werden dann schon, aber auf das Beispiel, kann ich meine Aussage so stehen lassen,
und sage nochmal solange wirklich alle felder auch benötigt werden hat dies keinen Einfluß auf die Performance.

mfg