Aggiunta di un po 'di quanto gli altri hanno detto.
Per prima cosa non è possibile utilizzare un indice basato su un valore nel mezzo della stringa. Gli indici sono generalmente ricerche sugli alberi, e non hai modo di sapere se la tua ricerca sarà più veloce della semplice scansione della tabella, quindi PostgreSQL imposterà automaticamente una scansione seq. Gli indici saranno utilizzati solo se corrispondono alla prima parte della stringa. Quindi:
SELECT * FROM invoice
WHERE invoice_number like 'INV-2012-435%'
può utilizzare un indice, ma non riesco a like '%44354456%'
.
In generale in LedgerSMB utilizziamo entrambi, a seconda del tipo di ricerca che stiamo eseguendo. Si potrebbe vedere una ricerca come:
select * from parts
WHERE partnumber ilike ? || '%'
and plainto_tsquery(get_default_language(), ?) @@ description;
Quindi questi sono molto diversi. Usali ognuno dove ha più senso.
fonte
2012-08-26 13:41:10
pg_trgm è molto utile. Per gli utenti di Django: indice su 'upper (your_text_field)' perché Django emette le query 'upper (x) like upper (y) 'invece di' ilike'. Se il campo è indicizzato senza 'upper', l'indice non verrà utilizzato in tali query. – Risadinha