Metodi di ricerca

Aperto da Alex, Venerdì - 13 Giugno 2014 - 12:41

0 Utenti e 1 Visitatore stanno visualizzando questa discussione.

Alex

Come tutti voi saprete nel menu amministrativo denominato "forum", c'è una voce  chiamata "ricerca", che porta ad interessanti opzioni, suddivise in tre categorie: Pesi, Metodo di ricerca e impostazioni.

In questo topic vorrei approfondire assieme a voi l'utilizzo della seconda voce: metodo di ricerca.

Un bel po' di mesi fa, il mio forum subì pesanti rallentamenti, imputabili probabilmente ad un mix di query che hanno stressato la coppia apache/mysql.

Cercando una maniera di alleggerire questo carico, trovai la possibilità di poter creare degli indici di ricerca. Comprai un numero importante di pacchetti DB dal mio provider e generai un'indice di ricerca personalizzato. Tale indice è grande circa tre volte la grandezza della tabella dei messaggi (tanta roba!).

In questo menu è possibile flaggare una voce che recita "obbliga gli utenti ad usare un indice di ricerca".

Flaggando o non flaggando questa voce, non riesco a capire cosa cambia nel metodo di ricerca.
Non ho capito se il cambiamente avviene "backend", quindi invisibile per l'utente.
Non ho capito dove (e se) si personalizza quest'indice personalizzato.
Non ho capito se smf sta usando questa enorme tabella per le query di ricerca effettuate dagli utenti.

Insomma.... voi la usate? Che ne sapete a tal proposito?

emanuele

Ohhh... la ricerca. Amore e odio.

Allora, iniziamo dal principio: cosa succede quando fai una ricerca?
SMF dovrà cercare all'interno di tutti i messaggi postati nel tempo il termine o i termini che stai cercando utilizzando una query SQL.
Prima differenza: gli indici.
* Nessun indice: significa che SQL (MySQL, Postgre, ecc.) non useranno alcun indice per la ricerca, quindi andranno all'interno della tabella messages e passeranno messaggio per messaggio alla ricerca del testo. Metodo lungo e spesso poco efficiente, ma risparmia spazio.
* Indice di tutto il testo: onestamente io non l'avrei tradotto, perché "fulltext" è effettivamente una caratteristica di un indice di MySQL, quindi è borderline. Cosa significa? MySQL (per Postgre mi pare sia disabilitato e non ricordo SQLite) si crea da solo un "indice" per sapere in quale messaggio compare una certa parola, quindi MySQL non andrà più messaggio per messaggio, ma cercherà direttamente nell'indice. Più veloce, occupa spazio.
* Indice personalizzato: utilizzando questo, SMF si crea una grossa tabella (solitamente molto grossa) in cui inserisce da una parte un termine e dall'altra il messaggio in cui quel termine compare, quando una parola viene cercata SMF andrà a cercare il termine in questa tabella. Ragionevolmente rapido, occupa spazio. Più o meno simile al fulltext anche se probabilmente meno efficiente, ma siccome in alcuni casi il fulltext non è possibile usarlo, si può ricorrere solo a questa soluzione.

Ora, MySQL è una brutta bestia che pensa di essere intelligente. Non mi addentro nel discorso indici, ma sinteticamente, diciamo che quando voi eseguite una query, MySQL l'analizzerà, osserverà le tabelle che deve interrogare, quali indici queste tabella hanno o non hanno, come questi indici interagiscono tra di loro, e cercherà di ottimizzare l'esecuzione della query in modo da renderla il più veloce (e forse parca di risorse) possibile. A volte questo implica non utilizzare uno degli indici a disposizione, ma usarne un altro. A volte può anche sbagliare.

In questo caso il "Obbliga ad utilizzare un indice di ricerca" (notare che non c'è nessun riferimento agli utenti ;)) significa che una volta spuntato, SMF forzerà MySQL ad utilizzare sempre l'indice a disposizione andando ad ignorare eventuali altre ottimizzazioni che MySQL potrebbe voler fare per la query in questione.

Ora, la tua domanda potrebbe essere: devo usarlo o no? Quando mi conviene usarlo e quando no?
Beh, non ne ho la più pallida idea. Nel 99% dei casi è un parametro che non ha alcuna influenza, perché MySQL utilizzerà già di suo l'indice e quindi nemmeno puoi accorgerti se è attivo o meno, nel restante 1% (che onestamente credo sia molto meno, forse intorno allo 0,1%) potrebbe fare una differenza. Nel bene o nel male, non mi è dato sapere.

Alex

ah però! Lieto (ironicamente) di sapere che di questa funzione non se ne sappia molto.

Vabbeh, non fasciamoci la testa.

In mancanza di riscontri oggettivi possiamo basarci su quelli statistici.

Riporto pertanto la mia esperienza.

In seguito all'utilizzo di un'indice personalizzato e l'obbligo del suo utlizzo da parte di smf (grazie Emanuele, ora ho capito) non ho più ricevuto segnalazioni dagli utenti di rallentamenti del forum, ed anche io ne ho riscontrato un immediato giovamento in termini di prestazioni.

Non sto dicendo che le pagine si aprono più velocemente, dico che non ci sono più stati quei rallentamenti così importanti da far scadere la richiesta di una pagina.

Discussioni simili (3)