Mysql
 sql >> Database >  >> RDS >> Mysql

La tabella con 80 milioni di record e l'aggiunta di un indice richiede più di 18 ore (o per sempre)! E adesso?

Ok si scopre che questo problema era più di un semplice creare una tabella, indicizzarla e dimenticare il problema :) Ecco cosa ho fatto nel caso qualcun altro dovesse affrontare lo stesso problema (ho usato un esempio di indirizzo IP ma funziona per altri anche i tipi di dati):

Problema:la tua tabella ha milioni di voci e devi aggiungere un indice molto velocemente

Caso d'uso: Prendi in considerazione l'archiviazione di milioni di indirizzi IP in una tabella di ricerca. L'aggiunta degli indirizzi IP non dovrebbe essere un grosso problema, ma la creazione di un indice su di essi richiede più di 14 ore.

Soluzione :partiziona la tabella utilizzando Partitionin di MySQL g strategia

Caso n. 1:quando la tabella che desideri non è ancora stata creata

CREATE TABLE IPADDRESSES(
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  ipaddress BIGINT UNSIGNED,
  PRIMARY KEY(id, ipaddress)
) ENGINE=MYISAM
PARTITION BY HASH(ipaddress)
PARTITIONS 20;

Caso n. 2:quando la tabella che desideri è già stata creata. Sembra esserci un modo per usare ALTER TABLE per farlo, ma non ho ancora trovato una soluzione adeguata per questo. Invece, c'è una soluzione leggermente inefficiente:

CREATE TABLE IPADDRESSES_TEMP(
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  ipaddress BIGINT UNSIGNED,
  PRIMARY KEY(id)
) ENGINE=MYISAM;

Inserisci i tuoi indirizzi IP in questa tabella. E quindi crea la tabella vera e propria con le partizioni:

CREATE TABLE IPADDRESSES(
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  ipaddress BIGINT UNSIGNED,
  PRIMARY KEY(id, ipaddress)
) ENGINE=MYISAM
PARTITION BY HASH(ipaddress)
PARTITIONS 20;

E poi finalmente

INSERT INTO IPADDRESSES(ipaddress) SELECT ipaddress FROM IPADDRESSES_TEMP;
DROP TABLE IPADDRESSES_TEMP;
ALTER TABLE IPADDRESSES ADD INDEX(ipaddress)

E il gioco è fatto... l'indicizzazione sulla nuova tabella mi ha impiegato circa 2 ore su una macchina a 3,2 GHz con 1 GB di RAM :) Spero che questo aiuti.