Ik ben een nieuwkomer in SQL dus het kan zijn dat er een simpele oplossing is, maar ik kan nergens een goede hint vinden.
Ik zit met volgende probleem: ik moet zoeken op n criteria op hetzelfde veld in een tabel. Dit gaat in een aantal gevallen al mis als N nog maar 3 is; het duurt dan veel te lang omdat MySQL een temporary table gaat aanmaken met een groot aantal records.
Ik gebruik de query:
De bedoeling is om een groot aantal teksten zoekbaar te maken door alle woorden (uitgezonderd stopwoorden) in een tabel op te nemen. Om efficiency redenen heb ik alle unieke woorden in een aparte tabel gezet. Die zijn gekoppeld aan een key, die leidt naar een woordnr/tekstnr tabel waar alle entries voor dat woord in staan en die wijzen dan naar een tabel met de echte teksten.
Als ik wil weten of een woord in een tekst voorkomt zoek ik dus eerst de unieke Wkey voor dat woord en doe daarmee een SELECT tekstnr FROM woordtekst WHERE wkey = xxx". Gaat razendsnel. (voor de duidelijkheid ik doe dit in dus vanuit VBA in losse queries, waarbij Wkey in een variabele gestopt wordt)
Bij twee woorden (xx AND yy) gaat het ook perfect, maar bij 3 woorden stort het tempo compleet in als de zoekwoorden te populair zijn omdat MySQL dan een temporary table gaat aanmaken voor de minst gebruikte zoekterm.
Kan ik dat efficienter oplossen? Als ik kijk naar de EXPLAIN output zie ik dat MyQL keurig het minst gebruikte zoekwoord neemt als basis voor de temporary table, maar het aantal rows totaal kan bij populaire termen oplopen tot 11615 USING WHERE; USING TEMPORARY TABLE X 32 X 32 en dat duurt oneindig.
Een oplossing voor N woorden is het dus al helemaal niet.
Hoe los ik dat slimmer op?
Ik zit met volgende probleem: ik moet zoeken op n criteria op hetzelfde veld in een tabel. Dit gaat in een aantal gevallen al mis als N nog maar 3 is; het duurt dan veel te lang omdat MySQL een temporary table gaat aanmaken met een groot aantal records.
Ik gebruik de query:
code:
1
2
3
| SELECT DISTINCT M1.Tekstnr FROM woordtekst M1, woordtekst M2, woordtekst M3 WHERE M1.Tekstnr = M2.Tekstnr AND M1.Tekstnr = M3.Tekstnr AND M1.Wkey = 136290 AND M2.Wkey = 136437 AND M3.Wkey = 136449 |
De bedoeling is om een groot aantal teksten zoekbaar te maken door alle woorden (uitgezonderd stopwoorden) in een tabel op te nemen. Om efficiency redenen heb ik alle unieke woorden in een aparte tabel gezet. Die zijn gekoppeld aan een key, die leidt naar een woordnr/tekstnr tabel waar alle entries voor dat woord in staan en die wijzen dan naar een tabel met de echte teksten.
Als ik wil weten of een woord in een tekst voorkomt zoek ik dus eerst de unieke Wkey voor dat woord en doe daarmee een SELECT tekstnr FROM woordtekst WHERE wkey = xxx". Gaat razendsnel. (voor de duidelijkheid ik doe dit in dus vanuit VBA in losse queries, waarbij Wkey in een variabele gestopt wordt)
Bij twee woorden (xx AND yy) gaat het ook perfect, maar bij 3 woorden stort het tempo compleet in als de zoekwoorden te populair zijn omdat MySQL dan een temporary table gaat aanmaken voor de minst gebruikte zoekterm.
Kan ik dat efficienter oplossen? Als ik kijk naar de EXPLAIN output zie ik dat MyQL keurig het minst gebruikte zoekwoord neemt als basis voor de temporary table, maar het aantal rows totaal kan bij populaire termen oplopen tot 11615 USING WHERE; USING TEMPORARY TABLE X 32 X 32 en dat duurt oneindig.
Een oplossing voor N woorden is het dus al helemaal niet.
Hoe los ik dat slimmer op?