Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[MySQL] Fulltext index en limit

Pagina: 1
Acties:

  • DRAFTER86
  • Registratie: April 2002
  • Laatst online: 17:22
Ik ben bezig met een php-applicatie waarmee gezocht wordt in een mysql database. De tabel waarin gezocht wordt bevat twee Fulltext-indices waarin gezocht kan worden. De resultaten moeten vervolgens met een instelbaar aantal per pagina worden weergegeven.
Dit doe ik met onderstaande query (voor de eerste pagina):
SQL:
1
2
3
4
SELECT * FROM table 
WHERE MATCH(column1) AGAINST('+searchterm1* +searchterm2*' IN BOOLEAN MODE) 
AND MATCH(column2) AGAINST('+searchterm3* +searchterm4*' IN BOOLEAN MODE) 
LIMIT 0,10;


En voor de 2e pagina (uitgaande van 10 results per pagina):
SQL:
1
2
3
4
SELECT * FROM table 
WHERE MATCH(column1) AGAINST('+searchterm1* +searchterm2*' IN BOOLEAN MODE) 
AND MATCH(column2) AGAINST('+searchterm3* +searchterm4*' IN BOOLEAN MODE) 
LIMIT 10,10;


Nu werkt dit opzich prima, alleen gaat Mysql voor die 2e pagina zoeken tot hij 20 results heeft, dan gooit hij de eerste 10 weg en de volgende 10 geeft hij terug. Dat is niet echt handig als men straks doorklikt naar pagina nr 80.
Nu zoek ik dus een manier om Mysql bij het doorklikken naar een volgende pagina een soort 'offset' mee te geven vanwaar hij moet beginnen met zoeken. Volgens mij moet dit kunnen aangezien het niet mogelijk hoeft te zijn om van pagina 1 direct door te klikken naar een willekeurige pagina, enkel naar de volgende.
Iemand hier ideëen over?

Verwijderd

Je resultaten inserten in een tweede tabel...

  • DRAFTER86
  • Registratie: April 2002
  • Laatst online: 17:22
Verwijderd schreef op maandag 15 oktober 2007 @ 21:48:
Je resultaten inserten in een tweede tabel...
Hoe bedoel je dat? In een keer alle resultaten op halen en in een temporary table gooien? Ik ben bang dat dat véél te traag is. Is het niet mogelijk om na een query met limit te onthouden waar in de index hij gebleven is en de volgende keer vanaf daar verder te zoeken?

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
DRAFTER86 schreef op maandag 15 oktober 2007 @ 21:26:
Nu zoek ik dus een manier om Mysql bij het doorklikken naar een volgende pagina een soort 'offset' mee te geven vanwaar hij moet beginnen met zoeken.
De x bij LIMIT x, y heet al letterlijk de offset. ;)
Limit 10000, 10 is vaak niet zo snel als het klinkt.
Iemand hier ideëen over?
Ideetjes:
- Beperk het max. aantal resultaten, hit 10001 op een zoekterm is niet boeiend cq. user moet maar beter zoeken.
- Beperk het max aantal en doe de offset in code, zodat je de query cache gebruikt. Overduidelijke nadelen zijn dat je op de query cache vertrouwt (dus weinig updates in die tabel is een pre) en dat je steeds teveel data uit je db trekt (vandaar ook tezamen met max. aantal).
- Resultaat cachen op andere wijze.
- Andere search engine. Als de tabel richting de miljoenen rijen gaat, heb je een dikke kans dat je gaat balen van fulltext performance voor uberhaupt de 1e 10 resultaten.
- etc etc

{signature}


Verwijderd

DRAFTER86 schreef op maandag 15 oktober 2007 @ 22:14:
Hoe bedoel je dat? In een keer alle resultaten op halen en in een temporary table gooien? Ik ben bang dat dat véél te traag is. Is het niet mogelijk om na een query met limit te onthouden waar in de index hij gebleven is en de volgende keer vanaf daar verder te zoeken?
Als je het goed doet is dat zeker weten niet te traag. Een meer dan 1000 resultaten hoef je doorgaans toch niet op te slaan. Nauwelijks iemand is dermate gestoord om zoveel pagina's door te bladeren ;)

Overigens hebben rownummers weinig zin aangezien bij text indexen de index doorgaans het eerste is dat wordt uitgevoerd.