Hallo!
Momenteel ben ik bezig met een SELECT statement over 4 tabellen in een MySQL database die over de betreffende tabellen ongeveer 50.000 records telt. Ongeveer iedere JOIN die ik echter uitvoer, kost de database minimaal zo'n 60 seconde om iets van een antwoord terug te geven. Is dat normaal bij een database van deze grootte? Ik kan me dat toch niet voorstellen.
De tabellen in de database zijn ongeveer als volgt:
De tabel conversion wordt momenteel gebruikt als opsomming van alle klantnrs die geldig zijn voor de eind-rapportage.
Nu wil ik graag alle klanten + resulaten hebben die vallen binnen de periode 23-April-2005 t/m 3-Mei-2005, waarvan de resultaat code-combinatie ofwel (9 + 20), ofwel (24 + 20) ofwel (19) is EN waarvan het klantnr voorkomt als newID in de tabel conversion.
Mijn Query daarvoor is als volgt geworden:
Ik haal dus de resultaten records 2 keer uit de database, zodat ik de verschillende combinaties kan controleren.
Deze query uitvoeren duurt inmiddels ongeveer 5 minuten. Kan dat anders/sneller/beter.
Overigens is het database-ontwerp een gegeven (het klantnr als VARCHAR 255 bijvoorbeeld). Die heb ik niet zelf zo opgezet.
Iedere suggestie is van harte welkom!
Momenteel ben ik bezig met een SELECT statement over 4 tabellen in een MySQL database die over de betreffende tabellen ongeveer 50.000 records telt. Ongeveer iedere JOIN die ik echter uitvoer, kost de database minimaal zo'n 60 seconde om iets van een antwoord terug te geven. Is dat normaal bij een database van deze grootte? Ik kan me dat toch niet voorstellen.
De tabellen in de database zijn ongeveer als volgt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| TABEL invoer_resultaten ( klantnr (INT 11) tijd (timestamp) resultaat (VARCHAR) ) TABEL klanten ( klantnr (VARCHAR 255) POSTCODE (VARCHAR 255) HUISNUM (VARCHAR 255) HUISNUMTOE (VARCHAR 255) ) TABEL conversion ( newID (INT 11) oldID (INT 11) ) |
De tabel conversion wordt momenteel gebruikt als opsomming van alle klantnrs die geldig zijn voor de eind-rapportage.
Nu wil ik graag alle klanten + resulaten hebben die vallen binnen de periode 23-April-2005 t/m 3-Mei-2005, waarvan de resultaat code-combinatie ofwel (9 + 20), ofwel (24 + 20) ofwel (19) is EN waarvan het klantnr voorkomt als newID in de tabel conversion.
Mijn Query daarvoor is als volgt geworden:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| SELECT
DISTINCT(RS1.klantnr), K.POSTCODE, K.HUISNR, K.HUISNRTOE,
date_format(RS1.tijd, '%e-%c-%y 00:00:00') AS datum,
RS1.resultaat AS rs1, RS2.resultaat AS rs2
FROM
invoer_resultaten AS RS1, invoer_resultaten AS RS2, klanten as K,
conversion AS C
WHERE
RS1.klantnr = K.klantnr
AND RS2.klantnr = K.klantnr
AND UNIX_TIMESTAMP(RS1.tijd) >= 1114207200
AND UNIX_TIMESTAMP(RS1.tijd) < 1115157600
AND UNIX_TIMESTAMP(RS2.tijd) >= 1114207200
AND UNIX_TIMESTAMP(RS2.tijd) < 1115157600
AND (
(RS1.resultaat = 9 AND RS2.resultaat = 20)
OR (RS1.resultaat = 20 AND RS2.resultaat = 24)
OR (RS1.resultaat = 19 AND RS2.resultaat = 19)
)
AND RS1.contact_id >= RS2.contact_id
AND K.klantnr = C.newID
ORDER BY RS1.contact_id DESC, RS1.klantnr |
Ik haal dus de resultaten records 2 keer uit de database, zodat ik de verschillende combinaties kan controleren.
Deze query uitvoeren duurt inmiddels ongeveer 5 minuten. Kan dat anders/sneller/beter.
Overigens is het database-ontwerp een gegeven (het klantnr als VARCHAR 255 bijvoorbeeld). Die heb ik niet zelf zo opgezet.
Iedere suggestie is van harte welkom!
[ Voor 4% gewijzigd door gvanh op 16-05-2005 15:31 ]