Ik heb een MySQL database met daarin 2 tabellen, één met activiteiten en één met een afstanden tabel voor postcodes. Structuur van de afstanden tabel:
De afstanden tabel bevat 16miljoen records met van iedere postcode de afstand tot iedere andere postcode.
De activiteiten tabel heeft ook een veld genaamd postcode1 met daarin ook een 4 cijferige code. met een index hier op. Hier staan ongeveer 15.000 records in. Ook de velden 'vast' en 'status' hebben een index.
Nu wil ik bezoekers via mijn website een postcode laten invoeren, en activiteiten binnen een bepaalde afstand tonen. Het probleem is dat ik met alleen de volgende query:
Al een execution time van 14 secondes krijg. Hoe kan ik deze tijd optimalizeren, of is MySQL uberhaupt wel een geschikte database server om met zoveel records te werken?
De volgende queries komen overigens wel snel en direct terug:
code:
1
2
3
4
| id (primary) postcode1 (INT(4), index) postcode2 (INT(4), index) afstand (INT, index) |
De afstanden tabel bevat 16miljoen records met van iedere postcode de afstand tot iedere andere postcode.
De activiteiten tabel heeft ook een veld genaamd postcode1 met daarin ook een 4 cijferige code. met een index hier op. Hier staan ongeveer 15.000 records in. Ook de velden 'vast' en 'status' hebben een index.
Nu wil ik bezoekers via mijn website een postcode laten invoeren, en activiteiten binnen een bepaalde afstand tonen. Het probleem is dat ik met alleen de volgende query:
code:
1
2
3
4
5
6
7
| SELECT a.id, a.titel, p.afstand FROM formulier_activiteiten a LEFT JOIN formulier_postcodes p ON p.postcode1 = a.postcode1 AND p.postcode2 = '8911' WHERE a.status =2 AND a.vast =1 GROUP BY a.id LIMIT 0 , 30 |
Al een execution time van 14 secondes krijg. Hoe kan ik deze tijd optimalizeren, of is MySQL uberhaupt wel een geschikte database server om met zoveel records te werken?
De volgende queries komen overigens wel snel en direct terug:
code:
1
2
3
4
5
| SELECT a.id, a.titel, p.afstand FROM formulier_activiteiten a LEFT JOIN formulier_postcodes p ON p.postcode1 = a.postcode1 AND p.postcode2 = '8911' GROUP BY a.id LIMIT 0 , 30 |
code:
1
2
3
4
| SELECT a.id, a.titel FROM formulier_activiteiten a WHERE a.status =2 AND a.vast =1 LIMIT 0 , 30 |