Mysql
 sql >> Base de données >  >> RDS >> Mysql

Table avec 80 millions d'enregistrements et ajouter un index prend plus de 18 heures (ou une éternité) ! Maintenant quoi?

Ok, il s'avère que ce problème était plus qu'un simple problème de création d'une table, d'indexation et d'oubli :) Voici ce que j'ai fait au cas où quelqu'un d'autre serait confronté au même problème (j'ai utilisé un exemple d'adresse IP mais cela fonctionne pour d'autres types de données aussi):

Problème :Votre table contient des millions d'entrées et vous devez ajouter un index très rapidement

Cas d'utilisation : Envisagez de stocker des millions d'adresses IP dans une table de recherche. L'ajout des adresses IP ne devrait pas être un gros problème, mais la création d'un index sur celles-ci prend plus de 14 heures.

Solution :Partitionnez votre table en utilisant MySQL's Partitionin g stratégie

Cas n° 1 :lorsque la table souhaitée n'est pas encore créée

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;

Cas n° 2 :lorsque la table souhaitée est déjà créée. Il semble y avoir un moyen d'utiliser ALTER TABLE pour ce faire, mais je n'ai pas encore trouvé de solution appropriée pour cela. Au lieu de cela, il existe une solution légèrement inefficace :

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

Insérez vos adresses IP dans ce tableau. Et puis créez la table réelle avec les partitions :

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;

Et puis enfin

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

Et voilà... l'indexation sur la nouvelle table m'a pris environ 2 heures sur une machine à 3,2 GHz avec 1 Go de RAM :) J'espère que cela vous aidera.