Ik ben al een aantal dagen bezig met het optimaliseren van een query. Deze query maakt gebruik van de fulltext zoek functionaliteiten van MySQL.
De tabel ziet er als volgt uit:
De data is 290,763 KiB groot
De index is 99,677 KiB groot
Totaal is de tabel dus 390,440 KiB groot
Deze tabel lijkt mij dus niet te groot om de uitvoertijden van de zoekqueries onder de seconde te kunnen krijgen.
Tijdens het optimaliseren ben ik tot de volgende resultaten gekomen:
Na toevoegen van een gecombineerde index:
De query is als volgt:
Normaal gesproken hoort er bij extra toch "using index" te staan? En is het ook normaal dat key_len op 0 blijft staan?
Tijdens het uitvoeren van de query is er constant hd gebruik, blijkbaar wordt er niet goed gebruik gemaakt van het aanwezige geheugen (query cache is uitgeschakeld om de koude uitvoertijd te kunnen meten). Ik heb al geprobeerd om de index in het geheugen te laden door gebruik te maken van "load index into cache", maar dit maakt geen verschil. De hele tabel in het geheugen plaatsen zou ik nog kunnen proberen, maar dan moet ik alle text velden omzetten naar varchar.
Heeft iemand anders nog ideeën over hoe ik deze query kan optimaliseren?
De tabel ziet er als volgt uit:
| bedrijfsnaam | varchar(135) |
| bezoek_straat | tinytext |
| bezoek_postcode | tinytext |
| bezoek_plaats | tinytext |
De data is 290,763 KiB groot
De index is 99,677 KiB groot
Totaal is de tabel dus 390,440 KiB groot
Deze tabel lijkt mij dus niet te groot om de uitvoertijden van de zoekqueries onder de seconde te kunnen krijgen.
Tijdens het optimaliseren ben ik tot de volgende resultaten gekomen:
| id | 1 |
| select_type | simple |
| table | bedrijven |
| type | all |
| possible_keys | null |
| key | null |
| key_len | null |
| ref | null |
| rows | 1446484 |
| extra | using where; using filesort |
| opmerkingen | geen index |
| text query | 7.0604 sec |
Na toevoegen van een gecombineerde index:
| id | 1 |
| select_type | simple |
| table | bedrijven |
| type | fulltext |
| possible_keys | bedrijfsnaam |
| key | bedrijfsnaam |
| key_len | 0 |
| ref | |
| rows | 1 |
| extra | using where; using filesort |
| opmerkingen | Fulltext index op bedrijfsnaam, bezoek_straat, bezoek_postcode, bezoek_plaats |
| text query | 1.2292 sec |
De query is als volgt:
SQL:
1
2
3
4
5
6
7
8
| select SQL_NO_CACHE SQL_CALC_FOUND_ROWS b.bezoek_postcode, b.bedrijfsnaam, b.bezoek_straat, b.bezoek_plaats, match(bedrijfsnaam, bezoek_straat, bezoek_postcode, bezoek_plaats) against ('+amsterdam') as 'score' FROM bedrijven b WHERE match(bedrijfsnaam, bezoek_straat, bezoek_postcode, bezoek_plaats) against ('+amsterdam' IN BOOLEAN MODE) ORDER BY SCORE DESC LIMIT 0, 25 |
Normaal gesproken hoort er bij extra toch "using index" te staan? En is het ook normaal dat key_len op 0 blijft staan?
Tijdens het uitvoeren van de query is er constant hd gebruik, blijkbaar wordt er niet goed gebruik gemaakt van het aanwezige geheugen (query cache is uitgeschakeld om de koude uitvoertijd te kunnen meten). Ik heb al geprobeerd om de index in het geheugen te laden door gebruik te maken van "load index into cache", maar dit maakt geen verschil. De hele tabel in het geheugen plaatsen zou ik nog kunnen proberen, maar dan moet ik alle text velden omzetten naar varchar.
Heeft iemand anders nog ideeën over hoe ik deze query kan optimaliseren?