sql >> Database >  >> RDS >> Mysql

Tabel met 80 miljoen records en het toevoegen van een index duurt meer dan 18 uur (of altijd)! Wat nu?

Ok blijkt dat dit probleem meer was dan gewoon een tabel maken, indexeren en probleem vergeten :) Dit is wat ik deed voor het geval iemand anders met hetzelfde probleem wordt geconfronteerd (ik heb een voorbeeld van een IP-adres gebruikt, maar het werkt voor andere ook gegevenstypen):

Probleem:uw tabel heeft miljoenen vermeldingen en u moet heel snel een index toevoegen

Gebruiksvoorbeeld: Overweeg om miljoenen IP-adressen op te slaan in een opzoektabel. Het toevoegen van de IP-adressen zou geen groot probleem moeten zijn, maar het maken van een index duurt meer dan 14 uur.

Oplossing :Partitioneer uw tabel met behulp van MySQL's Partitionin g-strategie

Geval #1:Wanneer de gewenste tafel nog niet is aangemaakt

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;

Geval #2:Wanneer de gewenste tafel al is gemaakt. Er lijkt een manier te zijn om ALTER TABLE te gebruiken om dit te doen, maar ik heb hier nog geen goede oplossing voor gevonden. In plaats daarvan is er een enigszins inefficiënte oplossing:

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

Vul uw IP-adressen in deze tabel in. En maak dan de eigenlijke tabel met partities:

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;

En dan eindelijk

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

En daar ga je... indexeren op de nieuwe tafel kostte me ongeveer 2 uur op een 3,2GHz-machine met 1GB RAM :) Ik hoop dat dit helpt.



  1. 1114 (HY000):De tafel is vol

  2. SQL Server 2008 Rij Tijdstempels invoegen en bijwerken

  3. Hoe te controleren of SQL-database beschadigd is - Oplossing om MDF-bestand te repareren

  4. SQL Server 2000 - Gekoppelde server