sql >> Base de Datos >  >> RDS >> Mysql

¡La tabla con 80 millones de registros y agregar un índice lleva más de 18 horas (o una eternidad)! ¿Ahora que?

Ok, resulta que este problema era más que simplemente crear una tabla, indexarla y olvidar el problema :) Esto es lo que hice en caso de que alguien más enfrente el mismo problema (he usado un ejemplo de dirección IP pero funciona para otros tipos de datos también):

Problema:su tabla tiene millones de entradas y necesita agregar un índice muy rápido

Caso de uso: Considere almacenar millones de direcciones IP en una tabla de búsqueda. Agregar las direcciones IP no debería ser un gran problema, pero crear un índice en ellas lleva más de 14 horas.

Solución :Particione su tabla usando MySQL's Partitionin g estrategia

Caso #1:Cuando la tabla que desea aún no está creada

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 #2:Cuando la tabla que desea ya está creada. Parece que hay una manera de usar ALTER TABLE para hacer esto, pero aún no he encontrado una solución adecuada para esto. En cambio, hay una solución ligeramente ineficiente:

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

Inserte sus direcciones IP en esta tabla. Y luego cree la tabla real con particiones:

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;

Y finalmente

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

Y listo... la indexación en la nueva tabla me tomó alrededor de 2 horas en una máquina de 3,2 GHz con 1 GB de RAM :) Espero que esto ayude.