Heeft iemand enig idee waarom m'n volgende query relatief erg traag is? Helaas ben ik gebonden aan MySQL. `factuurnummer` is geen geindexeerd veld maar een varchar.


SELECT * 
FROM boekhouding
WHERE factuurnummer
IN ( 
   SELECT factuurnummer
   FROM boekhouding
   GROUP BY factuurnummer
   HAVING COUNT( factuurnummer ) > 1
)
ORDER BY factuurnummer, tijd
LIMIT 0 , 50


De query selecteert alle gegevens van dubbele facturen.
Het zal toch met databasenormalisatie of MySQL te maken hebben. Kun je factuurnummer niet indexeren? Het lijkt mij dat dubbele factuurnummers juist niet mogen voorkomen, dus kan je er mooi een INDEX op gooien. Maar dan is deze query ook niet meer nodig..

Edit: wat is het nut van de query precies?
Er mogen inderdaad geen dubbele facturen voorkomen in de database, en daarom filter ik ze er nu uit. Hij selecteert alle records die een factuurnummer hebben dat dubbel voorkomt. Zonder IN is het dus ook niet te doen, want ik wil niet alleen de dubbele factuurnummers maar ook alle records waarin zo'n nummer voorkomt.
Hoeveel records staan er in de tabel?
Zo'n 6000.
Tsja, MySQL kan nou eenmaal niet omgaan met
a) complexere queries [waar dit er nog niet eens 1 van is]
b) veel records ( > 1 )
c) group by (hij verzint bijvoorbeeld maar wat als je een group by gebruikt met een * selectie)
d) input > toegestande waardes
e) ETCCCCCCCCCCCCCCCCCCCCc
> zie yapf.net

Ik denk dat er weinig aan te doen is, PlayHP.
Koel! Kunnen we geen anti-MySQL fanclub oprichten? Ik ben hier wel nieuw maar ben altijd in voor iets leuks ;-)
Nou, 6000 records vind ik eigenlijk behoorlijk weinig. Momenteel zit ik een paar duizend queries te doen op een database met een paar honderd miljoen records (MySQL) en dat vind ik qua performance best meevallen. Inderdaad een kwestie van goed indexeren.

Als het nog niet gebeurd is, zou ik in ieder geval aanbevelen een index op factuurnummer te zetten, want dat is toch de bottleneck in dit geval.

En wat is "relatief traag"? Doet de query er 10 seconden over, of 150, of drie dagen?

Eventueel zou je een tijdelijke (memory-)tabel kunnen maken met alle dubbele factuurnummers en die joinen in je query. Dan ben je van die subquery af; scheelt je wellicht ook nog in performance.
5 seconden in plaats van 0,1 seconde.

Maar gelukkig is deze query maar eenmalig, ik vroeg me alleen af hoe het kwam. De subquery, de index of het systeem.
6000 is ook niet veel. Maar wat mij betreft is het voor MySQL allemaal te veel. Anders zou het zich toch wel aan de SQL standaard houden?

Reageren