Domanda

Questa è probabilmente una situazione comune, ma non sono riuscito a trovare una risposta specifica su SO o Google.

Ho un grande tavolo (> 10 milioni di righe) di un amico relazioni su un database MySQL che è molto importante e deve essere mantenuta in modo tale che non vi siano righe duplicate. I negozi tabella uid dell'utente. Lo SQL per la tabella è:

CREATE TABLE possiblefriends(
 id INT NOT NULL AUTO_INCREMENT, 
 PRIMARY KEY(id),
 user INT, 
 possiblefriend INT)

Il modo in cui la tabella funziona è che ogni utente ha circa 1000 o giù di lì "possibili amici" che vengono scoperti e devono essere conservati, ma duplicato "possibili amici" devono essere evitati.

Il problema è che a causa della progettazione del programma, nel corso di un giorno, ho bisogno di aggiungere 1 milione di righe o più al tavolo che può o non essere le voci delle righe duplicate. La risposta più semplice sembrerebbe essere quello di controllare ogni riga per vedere se si tratta di un duplicato, e se non, quindi inserirlo nella tabella. Ma questa tecnica sarà probabilmente ottenere molto lento, come la dimensione della tabella aumenta a 100 milioni di righe, 1 miliardo di righe o superiori (che mi aspettavo che presto).

Qual è il modo migliore (cioè veloce) per mantenere questo tavolo unico?

Non c'è bisogno di avere una tabella con solo valori univoci sempre a portata di mano. Ho solo bisogno di una volta al giorno per i processi batch. In questo caso, devo creare una tabella separata che solo inserti tutte le possibili righe (contenente le righe duplicate e tutti), e quindi alla fine della giornata, creare una seconda tabella che calcola tutte le righe univoche nella prima tabella?

In caso contrario, qual è il modo migliore per questa tabella a lungo termine?

(Se gli indici sono la migliore soluzione a lungo termine, per favore, che gli indici di utilizzo dire)
È stato utile?

Soluzione

Aggiungi un indice univoco (user, possiblefriend) quindi utilizzare uno dei seguenti:

per garantire che non si ottiene errori quando si tenta di inserire una riga duplicata.

Si potrebbe anche prendere in considerazione se si può cadere la chiave e l'utilizzo primario (user, possiblefriend) incremento automatico come chiave primaria. Ciò farà diminuire la dimensione della vostra tavola e anche la funzione chiave primaria come l'indice, risparmiando di dover creare un indice aggiuntivo.

Vedi anche:

Altri suggerimenti

Un indice univoco vi permetterà di essere sicuri che il campo è davvero unico nel suo genere, è possibile aggiungere un indice univoco in questo modo:

CREATE TABLE possiblefriends( 
 id INT NOT NULL AUTO_INCREMENT,  
 PRIMARY KEY(id), 
 user INT,  
 possiblefriend INT,
PRIMARY KEY (id),
UNIQUE INDEX DefUserID_UNIQUE (user ASC, possiblefriend ASC))

Questo sarà anche il vostro accesso speec tavolo in modo significativo.

Il tuo altro problema con l'inserto di massa è un po 'più difficile, è possibile utilizzare la funzione in-built ON DUPLICATE KEY UPDATE di seguito:

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c+1;

UPDATE table SET c=c+1 WHERE a=1;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top