[mysql] index op month(datetime)

Pagina: 1
Acties:

  • killercow
  • Registratie: Maart 2000
  • Laatst online: 07-05 21:02
Is het mogeljk om in mysql 3.23 een index te maken op een datetime kolom, maar dan met bijvoorbeeld en functie erover heen? (dus month(), of year()).

Ik heb dit nodig om alle records uit een bepaalde maand + yaar op te halen aan de hand van de index, want het begint al trager te worden.

Ik heb bij mysql de manuals door genomen, en k heb uiteraard gegooled, maar ik vind helemaal niks.

phpMyAdmin heeft er ook geen ondersteuning voor, en dat is toch wel een indicatie dat het er gewoon niet is. Heeft iemand hier als een mee geklooid?
Of zijn er andere betere oplossing die de zelfde versnelling op kunnen leveren?

openkat.nl al gezien?


  • whoami
  • Registratie: December 2000
  • Laatst online: 09-05 01:02
Nee, dat is niet mogelijk.

Het is ook zo dat, vanaf dat je een functie gebruikt in je where clause, bv:
code:
1
where month(datum) = 1

de eventuele index die op 'datum' ligt, niet kan gebruikt worden.

Je kan het wel op een andere manier doen, door bv:
code:
1
where datum >= startdatum and datum <= einddatum

waarbij je dan startdatum de waarde geeft van de eerste datum binnen die maand, en einddatum de laatste datum is binnen die maand.

https://fgheysels.github.io/


  • killercow
  • Registratie: Maart 2000
  • Laatst online: 07-05 21:02
Hmfz,

Dat dacht ik al, Ik hoopte dat het toch mogelijk was, want zo vreselijk ingewikkeld lijkt het mij ook niet om te implementeren in mysql (al ken ik de source niet)

Ik wist dat een datum index niet meer werkte als je er een functie overheen gooide.

Helaas heb ik een datetime veld waarop ik "where", en dus heb ik ook de tijd erbij, die ik in de check niet nodig heb. (al hoewel dit kan ik ook wel met een gelimiteerde index doen (size=10).

[ Voor 21% gewijzigd door killercow op 05-04-2005 11:41 ]

openkat.nl al gezien?


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
killercow schreef op dinsdag 05 april 2005 @ 11:41:
Hmfz,

Dat dacht ik al, Ik hoopte dat het toch mogelijk was, want zo vreselijk ingewikkeld lijkt het mij ook niet om te implementeren in mysql (al ken ik de source niet)
Het is toch logisch dat dat niet werkt. De database moet de functie evalueren voor elke rij in de database om te zien of de rij aan de criteria voldoet, het lijkt me niet meer dan logisch dat dan de index niet gebruikt wordt.

Je kunt toch gewoon de oplossing van whoami gebruiken? Dan word de index wel gebruikt. Je kunt eventueel ook de tijd opnemen in de beide datums.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • whoami
  • Registratie: December 2000
  • Laatst online: 09-05 01:02
killercow schreef op dinsdag 05 april 2005 @ 11:41:


Helaas heb ik een datetime veld waarop ik "where", en dus heb ik ook de tijd erbij, die ik in de check niet nodig heb. (al hoewel dit kan ik ook wel met een gelimiteerde index doen (size=10).
[/]
Dat maakt toch niet uit ?
Als je een begindatum maakt bv:
01/01/2005 00:00:00
en een einddatum 01/02/2005 00:00:00
vervolgens doe je:
code:
1
where datum >= begindatum and datum < einddatum

voila.

https://fgheysels.github.io/


  • killercow
  • Registratie: Maart 2000
  • Laatst online: 07-05 21:02
true,

Maar zou het zo moeijlk zijn om tijdens de insert/update ook even de functies t evaluaten voor de aan te maken index? Dan zijn iig sommige functies wel mogenlijk in indexes.

Lijkt me dat zoiets redelijk vaak gebruikt wordt.

openkat.nl al gezien?


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
killercow schreef op dinsdag 05 april 2005 @ 11:47:
true,

Maar zou het zo moeijlk zijn om tijdens de insert/update ook even de functies t evaluaten voor de aan te maken index? Dan zijn iig sommige functies wel mogenlijk in indexes.
.
Alleen dus als je dan het resultaat van die evaluatie apart opslaat en daar een index op legt.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • whoami
  • Registratie: December 2000
  • Laatst online: 09-05 01:02
killercow schreef op dinsdag 05 april 2005 @ 11:47:
true,

Maar zou het zo moeijlk zijn om tijdens de insert/update ook even de functies t evaluaten voor de aan te maken index? Dan zijn iig sommige functies wel mogenlijk in indexes.

Lijkt me dat zoiets redelijk vaak gebruikt wordt.
Eh, ik zie eigenlijk eerlijk gezegd niet in waarom je dat zou doen.
Ok, je kan dan wel dat 'calculated' veld gaan gebruiken, omdat je dan een 'makkelijkere' select-query kan schrijven, maar wat is het voordeel ? Niets imo.

https://fgheysels.github.io/


  • ReallyStupidGuy
  • Registratie: Januari 2002
  • Laatst online: 01-05 10:31
whoami schreef op dinsdag 05 april 2005 @ 11:36:
Nee, dat is niet mogelijk.

Het is ook zo dat, vanaf dat je een functie gebruikt in je where clause, bv:
code:
1
where month(datum) = 1

de eventuele index die op 'datum' ligt, niet kan gebruikt worden.

Je kan het wel op een andere manier doen, door bv:
code:
1
where datum >= startdatum and datum <= einddatum

waarbij je dan startdatum de waarde geeft van de eerste datum binnen die maand, en einddatum de laatste datum is binnen die maand.
Dit lijkt me ook de meest logische manier om dit te doen, een functie als month() of year() is volgens mij meer iets om een record te vergelijken met andere records en niet om een selectie op te geven. Je kunt misschien een stored procedure gebruiken (weet niet of mysql dat ondersteund, ben op dit moment firebird gewend) met als input een maand en jaar en als output een selectie of alles in PHP afhandelen en alleen een select statement gebruiken.

Duizend wijzen kunnen meer vragen stellen dan één idioot kan beantwoorden.


Verwijderd

Wat je wilt gebruiken heet een virtual index. MySQL understeunt dit niet.

  • Onno
  • Registratie: Juni 1999
  • Niet online
P_de_B schreef op dinsdag 05 april 2005 @ 11:44:
Het is toch logisch dat dat niet werkt. De database moet de functie evalueren voor elke rij in de database om te zien of de rij aan de criteria voldoet, het lijkt me niet meer dan logisch dat dan de index niet gebruikt wordt.
Dat hoeft helemaal niet. Normaliter houdt een database van elke functie bij of deze deterministisch is, dus of er bij een gegeven input altijd dezelfde output uitkomt. Op functies waarvoor dat geldt, zoals het opvragen van de maand van een datum, kun je prima indices hebben. In bijvoorbeeld PostgreSQL kan dat dan ook gewoon.

Dat het in MySQL niet kan heeft enkel met beperkingen van MySQL te maken, het is niet logisch.
Pagina: 1