Hoe kan ik slim querien om alle afspraken op te vragen die op een bepaalde dag plaatsvinden, waarbij sommige afspraken over meer dagen verspreid zijn door middel van een start en eind-datum.
Ik heb al geprobeerd een oplossing te vinden, maar de oplossingen die ik vind gaan over afspraken zoeken binnen een bepaalde range. Bij mij is het dus juist andersom: de afspraken bestaan uit ranges en de input is één datum.
Nu heb ik de volgende test tabel:
Die ik vul met de volgende door excel gegenereerde test-data (40000 records is een leuk aantal):
Ik gebruik nu de volgende query, maar die kan volgens mij slimmer:
Met slimmer bedoel ik ook sneller, dus in plaats van "Query duurde 0.0553 sec" wil ik "Query duurde 0.0003 sec" zien
De optimalisatie waar ik zelf aan zat te denken heeft ermee te maken dat er gemiddeld maar een paar resultaten zijn voor één dag en dat in 99% van de gevallen de start-datum gelijk is aan de eind-datum. Daardoor zou in 99% van de gevallen een simpele "WHERE `start` = '$dag'" voldoende zijn en hoeft de complexere query op maar een klein gedeelte van het bestand uitgevoerd worden ... dus --> snelheidswinst
Dus dacht ik ik leg gewoon een index op de expressie "einde - start" maar dat ondersteund MySql niet...
Voor nu geef ik gebruikers gewoon niet de mogelijkheid om taken over meer dagen te laten lopen, maar het zou cooler zijn als ik die mogelijkheid wel kon bieden.
Er is natuurlijk ook een tussenvorm mogelijk waarbij ik de mogelijkheid geef om een taak maar over een beperkt aantal dagen te spreiden waardoor volgens mij de ... WAUW dat helpt super (0.0004 sec). Maar ja als iemand nog een betere oplossing weet
Ik heb al geprobeerd een oplossing te vinden, maar de oplossingen die ik vind gaan over afspraken zoeken binnen een bepaalde range. Bij mij is het dus juist andersom: de afspraken bestaan uit ranges en de input is één datum.
Nu heb ik de volgende test tabel:
code:
1
2
3
4
5
6
7
8
| CREATE TABLE `daterange` ( `eventnaam` varchar(25) NOT NULL default '', `start` int(11) NOT NULL default '0', `einde` int(11) NOT NULL default '0', KEY `start` (`start`), KEY `einde` (`einde`), KEY `search` (`start`,`einde`) ) TYPE=MyISAM; |
Die ik vul met de volgende door excel gegenereerde test-data (40000 records is een leuk aantal):
code:
1
2
3
4
| A2 = KIEZEN(AFRONDEN(ASELECT()^8*5;0)+1;"afspraak"; "terugbellen"; "offerte"; "vergadering"; "vakantie"; "tandarts")
B2 = AFRONDEN(ASELECT()*50000;0)
C2 = B2+AFRONDEN(ASELECT() ^16 * 20;0)
D2 = "INSERT INTO `daterange` VALUES ('" & A2 & "', '" & B2 & "', '" & C2 & "');" |
Ik gebruik nu de volgende query, maar die kan volgens mij slimmer:
code:
1
2
3
| SELECT * FROM `daterange` WHERE `start` <= '$dag' AND `einde` >= '$dag'; |
Met slimmer bedoel ik ook sneller, dus in plaats van "Query duurde 0.0553 sec" wil ik "Query duurde 0.0003 sec" zien
De optimalisatie waar ik zelf aan zat te denken heeft ermee te maken dat er gemiddeld maar een paar resultaten zijn voor één dag en dat in 99% van de gevallen de start-datum gelijk is aan de eind-datum. Daardoor zou in 99% van de gevallen een simpele "WHERE `start` = '$dag'" voldoende zijn en hoeft de complexere query op maar een klein gedeelte van het bestand uitgevoerd worden ... dus --> snelheidswinst
Dus dacht ik ik leg gewoon een index op de expressie "einde - start" maar dat ondersteund MySql niet...
Voor nu geef ik gebruikers gewoon niet de mogelijkheid om taken over meer dagen te laten lopen, maar het zou cooler zijn als ik die mogelijkheid wel kon bieden.
Er is natuurlijk ook een tussenvorm mogelijk waarbij ik de mogelijkheid geef om een taak maar over een beperkt aantal dagen te spreiden waardoor volgens mij de ... WAUW dat helpt super (0.0004 sec). Maar ja als iemand nog een betere oplossing weet