Jag sitter och ska fixa en funktion som listar, låt säga 10 poster mha AJAX under en inputbox beroende på vad man skrivit som en datalist.
Detta är egentligen ingen svår grej, men kruxet är att tabellen som innehåller de ord som ska föreslås är... gigantisk... Vi talar om miljoner rader. Jag ser framför mig hur servern gråter. Jag vill inte ha någon färdig lösning på detta, det är inget roligt, men jag skulle vilja bolla lite tankar och idéer med någon eller några.
Vilken approach bör jag välja? Vilka tekniska problem och begränsningar bör jag ha i åtanke? Osv, osv...
Är det något i stil med auto complete du tänker på med andra ord?
Jag tänker att du ska ha ett bra index till att börja med, och det ska inte vara ett hashat index utan snarare något trädbaserat, då kan du lätt göra sökningar på strängar som börjar med någonting valfritt. Ganska enkelt och okomplicerat.
Ja, precis, auto complete men med flera alternativ hela tiden. Den enklaste lösningen i min värld är ju bara att skicka ett anrop via AJAX vid onKeyUp() på inputfältet, men jag har gjort en sådanhär lösning tidigare med Like och %. Det slutade i katastrof. :P
Hade du vettiga index då? Sen kan det vara en bra idé att inte skicka en request direkt på keyup utan köra en timeout som kan resetas ifall ytterligare någon tangent trycks ner inom en snar framtid
Index, index, index. Utan ett vettigt index så kommer det aldrig gå. Med ett vettigt index så kommer det gå galant. Skillnaden är att med inget index/fel index så kommer din sökning behöva gå igenom samtliga rader i tabellen, men med rätt index så kommer den leta sig ner i ett träd med början i roten, och ta rätt väg hela tiden, och kommer enbart titta på det som stämmer, det som inte stämmer struntar den fullkomligt i.
Ah ok full text index , då tror jag du är inne på rätt spår redan : )
Andra alternativ, beroende på hur din data ser ut, kan vara att replikera ut data till en annan tabell eller databas som är mer "sökvänlig". Alltså om du t.ex kör joins eller liknande nu så kan det gå att aggregera data från original tabellen/tabellerrna med ett schedulerat jobb till en ny tabell/tabeller .
Man kan även sätta fler index på den /de nya tabellerna utan att skrivningar/uppdateringar blir sega med detta angreppssätt.
Om detta är applicerbart i just detta fall..
Är väl att föredra framför vanliga php cron jobb antar jag.
Men samtidigt, om du kan lösa detta med enbart index eller fulltext varianten så är det ju kanske overkill
Känns spontant som att detta kan bli en resurskrävande operation , dvs autocomplete mot så mycket data. Kanske värt att låta den ajax requesten gå mot en annan DB server, det borde gå att göra så att schedulerade jobbet skriver till en annan server.