Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Eine Tabelle mit 80 Millionen Datensätzen und das Hinzufügen eines Index dauert mehr als 18 Stunden (oder ewig)! Was jetzt?

Ok, es stellt sich heraus, dass dieses Problem mehr war als nur ein einfaches Erstellen einer Tabelle, Indizieren und Vergessen des Problems :) Folgendes habe ich getan, falls jemand anderes dasselbe Problem hat (ich habe ein Beispiel für eine IP-Adresse verwendet, aber es funktioniert für andere auch Datentypen):

Problem:Ihre Tabelle enthält Millionen von Einträgen und Sie müssen sehr schnell einen Index hinzufügen

Anwendungsfall: Erwägen Sie, Millionen von IP-Adressen in einer Nachschlagetabelle zu speichern. Das Hinzufügen der IP-Adressen sollte kein großes Problem darstellen, aber das Erstellen eines Indexes darauf dauert mehr als 14 Stunden.

Lösung :Partitionieren Sie Ihre Tabelle mit MySQL's Partitionin g-Strategie

Fall #1:Wenn die gewünschte Tabelle noch nicht erstellt wurde

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;

Fall #2:Wenn die gewünschte Tabelle bereits erstellt ist. Es scheint eine Möglichkeit zu geben, ALTER TABLE dafür zu verwenden, aber ich habe noch keine richtige Lösung dafür gefunden. Stattdessen gibt es eine etwas ineffiziente Lösung:

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

Tragen Sie Ihre IP-Adressen in diese Tabelle ein. Und erstellen Sie dann die eigentliche Tabelle mit Partitionen:

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;

Und dann endlich

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

Und los geht's ... das Indizieren auf der neuen Tabelle dauerte etwa 2 Stunden auf einem 3,2-GHz-Computer mit 1 GB RAM :) Hoffe, das hilft.