Na een middagje topics lezen op GoT, ben ik er toch nog niet uitgekomen. Probleem is als volgt:
Ik heb een database met daarin een groot (voor mijn doen dan
) aantal records; 300.000.
Kleine indicatie van de database
Nu is het de bedoeling dat een gebruiker kan zoeken door middel van een 'naam' en 'plaats' in te geven.vb: pietje wil graag alle bouw-bedrijven uit amsterdam.
de eerste methode hoe ik het heb geprobeerd is met like, tevens gebruikt gemaakt van 1 index op naam, 1 index op plaats, en nog een index op beide samen.
query daar bij was:
snelheid; 20 sec.
na wat searchen hier op GoT kwam ik het een en ander tegen over fulltext search, oké leuk dat dan maar even proberen...
index van plaats bleef gewoon staan
op naam werd een full-text index aangemaakt.
query hierbij was:
snelheid; 16 sec.
het explain statement vertelde mij trouwens netjes dat er gebruik werd gemaakt van beide indexen
Na wat prutsen aan bovenstaande query had ik "AND city ='amsterdam' " weggehaald, gewoon om te kijken hoe snel dat ging. Wat bleek; binnen 0,02 seconde vertoonde MySQL alle bouw* bedrijven.
Dus ik denk probeer het ook even andersom, dus "match (naa ....... IN BOOLEAN MODE)" weghalen. Wat bleek hier weer, binnen een 0,02 seconde stonden alle bedrijven uit amsterdam voor mijn neus.
Maarja, dat ik alleen de bouwbedrijven uit heel nederland had, of alleen alle bedrijven uit amsterdam had ik natuurlijk niet veel aan. Dus toen de volgende query in elkaar geknutseld.
1 fulltext index voor naam
1 fulltext index voor plaats
kortom 2 maal match in 1 query.
snelheid; 16 sec.
Zoals je ziet zijn de snelheden niet echt om over naar huis te schrijven. Alleen bij een aparte select zonder 'AND' werkt het allemaal wel vlotjes.
Heeft iemand enig idee, hoe deze select query sneller te maken? Of zie ik iets over het hoofd met de indexen? Opmerkingen zijn meer dan welkom
Ik heb een database met daarin een groot (voor mijn doen dan
Kleine indicatie van de database
code:
1
2
3
4
5
| id; int(10) naam; varchar(60) plaats; varchar(40) tel; varchar(20), ivm sommige naambel-nummers geen int, bigint website; varchar(40) |
Nu is het de bedoeling dat een gebruiker kan zoeken door middel van een 'naam' en 'plaats' in te geven.vb: pietje wil graag alle bouw-bedrijven uit amsterdam.
de eerste methode hoe ik het heb geprobeerd is met like, tevens gebruikt gemaakt van 1 index op naam, 1 index op plaats, en nog een index op beide samen.
query daar bij was:
code:
1
| SELECT * FROM `tabel` WHERE naam LIKE 'bouw%' AND plaats = 'amsterdam' |
snelheid; 20 sec.
na wat searchen hier op GoT kwam ik het een en ander tegen over fulltext search, oké leuk dat dan maar even proberen...
index van plaats bleef gewoon staan
op naam werd een full-text index aangemaakt.
query hierbij was:
code:
1
| SELECT * FROM `tabel` WHERE match (naam) against ('bouw*' IN BOOLEAN MODE) AND city = 'amsterdam' |
snelheid; 16 sec.
het explain statement vertelde mij trouwens netjes dat er gebruik werd gemaakt van beide indexen
Na wat prutsen aan bovenstaande query had ik "AND city ='amsterdam' " weggehaald, gewoon om te kijken hoe snel dat ging. Wat bleek; binnen 0,02 seconde vertoonde MySQL alle bouw* bedrijven.
Dus ik denk probeer het ook even andersom, dus "match (naa ....... IN BOOLEAN MODE)" weghalen. Wat bleek hier weer, binnen een 0,02 seconde stonden alle bedrijven uit amsterdam voor mijn neus.
Maarja, dat ik alleen de bouwbedrijven uit heel nederland had, of alleen alle bedrijven uit amsterdam had ik natuurlijk niet veel aan. Dus toen de volgende query in elkaar geknutseld.
1 fulltext index voor naam
1 fulltext index voor plaats
kortom 2 maal match in 1 query.
code:
1
| SELECT * FROM `tabel` WHERE match (naam) against ('bouw*' IN BOOLEAN MODE) AND match (plaats) against ('dongen' ) |
snelheid; 16 sec.
Zoals je ziet zijn de snelheden niet echt om over naar huis te schrijven. Alleen bij een aparte select zonder 'AND' werkt het allemaal wel vlotjes.
Heeft iemand enig idee, hoe deze select query sneller te maken? Of zie ik iets over het hoofd met de indexen? Opmerkingen zijn meer dan welkom