Domanda

Ho una tabella mysql contenente 40 milioni di record che viene popolata da un processo sul quale non ho alcun controllo.I dati vengono aggiunti solo una volta al mese.Questa tabella deve essere ricercabile tramite la colonna Nome.Ma la colonna del nome contiene il nome completo nel formato "Last First Middle".

Nel sphinx.conf, ho

sql_query = SELECT Id, OwnersName,
substring_index(substring_index(OwnersName,' ',2),' ',-1) as firstname, 
substring_index(OwnersName,' ',2) as lastname
FROM table1

Come posso utilizzare la ricerca Sfinge per effettuare ricerche per nome e/o cognome?Vorrei poter cercare "Smith" solo con il nome?

È stato utile?

Soluzione

A giudicare dalle altre risposte, forse ho perso qualcosa ... ma per limitare una ricerca in Sfinge ad un campo specifico, assicurarsi che si sta utilizzando il (o Ext2) Modalità corrispondenza estesa, e quindi utilizzare la seguente query stringa:. @firstname Smith

Altri suggerimenti

Le funzioni per riga nelle query SQL sono sempre una cattiva idea per le tabelle che possono diventare grandi.Se desideri eseguire la ricerca su parte di una colonna, è necessario estrarla nella propria colonna e indicizzarla.

Suggerirei, se hai potere sullo schema (in contrapposizione al processo di popolamento), di inserire nuove colonne denominate OwnersFirstName e OwnersLastName insieme a un trigger di aggiornamento/inserimento che estrae le informazioni rilevanti da OwnersName e popola le nuove colonne in modo appropriato.

Ciò significa che la spesa per determinare il nome viene sostenuta solo quando una riga viene modificata, non ogni singola volta esegui la tua query.Quello è il momento giusto per farlo.

Quindi le tue domande diventano incredibilmente veloci.E, sì, questo interrompe 3NF, ma la maggior parte delle persone non si rende conto che va bene farlo per motivi di prestazioni, a patto di comprenderne le conseguenze.E poiché le nuove colonne sono controllate dai trigger, la duplicazione dei dati che sarebbe motivo di preoccupazione è "pulita".

La maggior parte dei problemi che le persone hanno con i database è la velocità delle loro query.Sprecare un po' di spazio su disco per ottenere un notevole miglioramento delle prestazioni di solito va bene.

Se hai assolutamente NO potere anche sullo schema, un'altra possibilità è creare un proprio database con lo schema "corretto" e popolarlo periodicamente dal database reale.Quindi interroga il tuo.Tuttavia, ciò potrebbe comportare un bel po' di trasferimento di dati ogni mese, quindi la prima opzione è quella migliore, se consentita.

Si potrebbe utilizzare stringa per ottenere le parti del campo che si desidera cercare, ma che rallenterà il processo. La query non può utilizzare qualsiasi tipo di indice per fare il confronto, in modo che deve toccare ogni record della tabella.

La cosa migliore sarebbe di non memorizzare più valori nello stesso campo, ma mettere i componenti del nome in tre campi distinti. Quando si memorizzano più di un valore in un campo è quasi sempre alcuni problemi di accesso ai dati. Vedo questo più e più volte in diverse sedi ...

Questa è una problrm intrattabile perché i nomi fulll può contenere prefissi, suffissi, secondi nomi e senza secondi nomi, nomi e cognomi compositi con e senza trattini, ecc Non c'è modo ragionevole per fare questo con un'affidabilità del 100%

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top