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

Tabel med 80 millioner poster og tilføjelse af et indeks tager mere end 18 timer (eller for evigt)! Hvad nu?

Ok, det viser sig, at dette problem var mere end blot en simpel oprettelse af en tabel, indekser den og glem problemet :) Her er, hvad jeg gjorde, hvis en anden står over for det samme problem (jeg har brugt et eksempel på IP-adresse, men det virker for andre datatyper også):

Problem:Din tabel har millioner af poster, og du skal tilføje et indeks rigtig hurtigt

Usecase: Overvej at gemme millioner af IP-adresser i en opslagstabel. Tilføjelse af IP-adresser burde ikke være et stort problem, men at oprette et indeks på dem tager mere end 14 timer.

Løsning :Partitioner din tabel ved hjælp af MySQL's Partitionin g-strategi

Case #1:Når den ønskede tabel endnu ikke er oprettet

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;

Case #2:Når den ønskede tabel allerede er oprettet. Der lader til at være en måde at bruge ALTER TABLE til at gøre dette på, men jeg har endnu ikke fundet en ordentlig løsning til dette. I stedet er der en lidt ineffektiv løsning:

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

Indsæt dine IP-adresser i denne tabel. Og opret så den faktiske tabel med partitioner:

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;

Og så endelig

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

Og der er det... indeksering på det nye bord tog mig omkring 2 timer på en 3,2 GHz maskine med 1 GB RAM :) Håber dette hjælper.



  1. Fuldstændig afinstallere PostgreSQL 9.0.4 fra Mac OSX Lion?

  2. Hibernate kunne ikke hente SequenceInformation fra databasen

  3. Optimer MySQL/MariaDB-ydeevnen med MySQLTunner-værktøjet

  4. Udskrivning til skærm i .sql-fil postgres