Toon posts:

[MySQL] Trage query

Pagina: 1
Acties:

Verwijderd

Topicstarter
De volgende query duurt bij mij 27 sec. Ik heb alle tabellen geoptimezed en de juiste indeces aangemaakt. Kan ik deze query nog optimaliseren? Zonder DISTINCT is hij zelfs nog een seconde langzamer.

Het zit hem in het OR gedeelte, zonder dit gedeelte duurt de query hooguit 1 sec.

code:
1
2
3
4
5
6
7
8
9
SELECT DISTINCT klanten.id_klant
FROM klanten,data_kt,titels 
WHERE klanten.id_klant=data_kt.id_klant 
AND data_kt.id_titel=titels.id_titel 
AND datum_retourneren!='0000-00-00' 
OR (datum_reserveren='0000-00-00' 
       AND datum_uitlenen='0000-00-00'
       AND data_ktdatum_uitlenen_retourneren='0000-00-00'
       AND datum_retourneren='0000-00-00');

  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 19-05 09:52

thomaske

» » » » » »

Je kan met EXPLAIN bekijken welke indices er precies worden gebruikt

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


  • Japie.G
  • Registratie: Augustus 2001
  • Laatst online: 27-05 13:51

Japie.G

Colour Classic

stel je maakt je tabbellen leeg, duurt de query dan ook zo lang? vraag me dan toch af of je indexes wel goed zijn.

probeer ook de query op een ander station uit te voeren, om zeker t weten dat het echt aan je query ligt, en niet aan de sql server!

[ Voor 61% gewijzigd door Japie.G op 26-02-2004 14:09 ]

Renault Scenic E-Tech EV - PV-Output - 48kWh LiFePo4 op 15kVa Victron systeem


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Op welke velden heb je indexen liggen?
Zijn je datum velden van het type date/datetime? Zoja, waarom zet je dan quotes rond je argumenten?
Als je dat doet, moet je DBMS al je datum-velden gaan vergelijken met strings , er moet dus ergens een omzetting gebeuren achter de schermen wat heel wat tijd in beslag neemt.

Als je wilt testen of datum_reserveren etc... ingevuld is of niet, waarom check je dan niet zo:
code:
1
datum_reserveren IS NULL

https://fgheysels.github.io/


  • Noork
  • Registratie: Juni 2001
  • Niet online
whoami schreef op 26 februari 2004 @ 14:07:
Als je wilt testen of datum_reserveren etc... ingevuld is of niet, waarom check je dan niet zo:
code:
1
datum_reserveren IS NULL
Misschien is 00-00-0000 een default?

Ja, je kunt toch in je script/applicatie dit gewoon inserten wanneer je geen waarde invult. Dus vandaar. Maar oke, ik ben benieuwd naar het antwoord van de TS.

[ Voor 23% gewijzigd door Noork op 26-02-2004 14:11 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
00-00-0000 is alleszins geen geldige datum, en zal je dus ook niet als default kunnen maken.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ohnee, en wanneer werd Jezus geboren dan? :+ .

Ik heb al op een andere machine geprobeert met hetzelfde resultaat. Als de tabllen leeg zijn is hij supersnel. Ik ga even EXPLAIN en die quotes proberen.

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Van welk type zijn die velden? Zijn het datumvelden?
Wil je checken of ze leeg zijn?

https://fgheysels.github.io/


  • Noork
  • Registratie: Juni 2001
  • Niet online
Krijg je wel de juiste resultaten terug?

Verwijderd

Topicstarter
Gaat checken of ze NULL zijn dan sneller? Dan zou ik een aantal scripts aan moeten passen en daar heb ik niet heel veel zin in. Volgens mij gaat het niet sneller namelijk. Checken of ze "" (NULL) zijn of een andere waarde.

Quotes rond de datum maakt niet uit. Met EXPLAIN zie ik (hopelijks is dit leesbaar):

code:
1
2
3
4
table  type  possible_keys  key  key_len  ref  rows  Extra  
titels ALL PRIMARY NULL NULL NULL 1208 Using temporary 
data_kt ALL id_klant,id_titel NULL NULL NULL 345   
klanten ALL PRIMARY,id_klant NULL NULL NULL 345 where used


Resultaten zijn prima die ik terug krijg. Het type van het veld is DATE.

[ Voor 10% gewijzigd door Verwijderd op 26-02-2004 14:23 ]


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Je bent wat haakjes vergeten, zo zit je een carthetisch produkt te maken.

edit:
waarschijnlijk heb je dit bedoeld:
code:
1
2
3
4
5
6
7
8
9
SELECT DISTINCT klanten.id_klant
FROM klanten,data_kt,titels 
WHERE klanten.id_klant=data_kt.id_klant 
AND data_kt.id_titel=titels.id_titel 
AND (datum_retourneren!='0000-00-00' 
OR (datum_reserveren='0000-00-00' 
       AND datum_uitlenen='0000-00-00'
       AND data_ktdatum_uitlenen_retourneren='0000-00-00'
       AND datum_retourneren='0000-00-00'));

[ Voor 75% gewijzigd door justmental op 26-02-2004 14:24 ]

Who is John Galt?


Verwijderd

Topicstarter
Hell yeah. Dat was hem. Dom ook eigenlijk. Dat dat zoveel kan uitmaken he. Nu duurt het 0,002s. Betere getallen. :)

[ Voor 62% gewijzigd door Verwijderd op 26-02-2004 14:26 ]

Pagina: 1