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..
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.
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
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.