DB archiviazione files e ricerca | SQL & MySQL

Topic: Pubblico - Composto da 2 Posts di 2 Utenti.

26 Luglio, 2011 08:59 #1
ThRiX
Utente

ThRiX
Registrato: Jul, 2011
Posts: 1
Offline

Ciao a tutti!
Per esigenze di vita e lavorative ho realizzato un software gestionale basato su php e mysql.
Oltre a contenere tabelle "classiche" come anagrafica, calendario, bilanci ecc. ho creato una tabella per l'archiviazione dei files, non volendo sfruttare soluzioni come NAS, SAMBA ecc.
Ad oggi, dopo poco più di un anno di utilizzo, mi trovo con un DB di circa 7 GB, con una previsione di crescita, da oggi, di ca. 10 GB all'anno.

L'inserimento di nuovi record (quindi nuovi files) e la loro visualizzazione/download funziona senza problemi, ho iniziato a trovare difficoltà nel velocizzare la ricerca...

Quando ho "progettato" il DB ho inserito campi come: ID, Nome, Descrizione, Note
i quali contengono rispettivamente: ID Univoco Primario, Nome del file (es. "Immagine.jpg"), Descrizione del files (es. "Scadenzario 2010 per comunicazioni compagnia..."), Eventuali note aggiuntive.

Il problema è che avviando la ricerca devo attendere quasi un minuto per ottenere l'elenco dei risultati, anche utilizzando phpmyadmin... (presumendo quindi che non sia dovuto dal codice sql da me utilizzato per avviare la ricerca)

Questo è il codice a cui mi riferivo, che utilizzo per effettuare la ricerca:

 1if ($_POST['parametri_ricera'] == 'full') {
 2        $parametri_in = $parametri_out = '"';
 3} else {
 4        $parametri_in  = '('; $parametri_out = ')';
 5}
 6
 7
 8$valori = MySQL_query('
 9SELECT id, descrizione, riservato, MATCH(descrizione, note) AGAINST(\'+'.$parametri_in.$_POST['cerca'].$parametri_out.'\' IN BOOLEAN MODE) AS attinenza
10FROM pmdm.archivio_files
11WHERE MATCH(descrizione, note) AGAINST(\'+'.$parametri_in.$_POST['cerca'].$parametri_out.'\' IN BOOLEAN MODE)
12OR id = \''.$_POST['cerca'].'\'
13ORDER BY descrizione, attinenza DESC');

Allego inoltre dei dati (spero utili) per poter "identificare" l'eventuale problema di lentezza!

Grazie 1000

Ultima modifica 26 Luglio, 2011 09:00 di ThRiX

10 Agosto, 2011 01:56 #2
fuser
Utente

fuser
Registrato: Aug, 2011
Posts: 86
Offline

Purtroppo le ricerche FULLTEXT di MySQL sono lente.
Vedo due possibili problemi:
(*) Quella query deve davvero restituire SIA i risultati della ricerca fulltext, SIA un singolo record corrispondente a un certo id? Credo piuttosto che sia una query-jolly che, a seconda dei parametri, fa una cosa o un'altra. Se è così, dividila in due query diverse. (tu dirai: "id ha una chiave primaria"... sì, ma in una query del genere MySQL non riesce a usarla!)
(*) Ha senso ordinare per descrizione e, secondariamente, per rilevanza? Se è possibile, elimina la ORDER BY. I record ti verranno restituiti comunque in ordine di rilevanza.
Un consiglio: il campo id è INTEGER, ma nel tuo caso è sufficiente SMALLINT, che è grande la metà.
Ultimo suggerimento: non credo che con la query tu voglia tutti e 13000 i record; usa LIMIT.
Se tutto questo non basta, potresti prendere in considerazione questo:
http://sphinxsearch.com/docs/2.0.1/sphinxse.html

Ultima modifica 10 Agosto, 2011 02:01 di fuser

Condividi su:

Loggati o Registrati per replicare