sql >> Databasteknik >  >> RDS >> Mysql

Tabell med 80 miljoner poster och att lägga till ett index tar mer än 18 timmar (eller för alltid)! Nu då?

Ok, det visar sig att det här problemet var mer än att bara skapa en tabell, indexera den och glömma problemet :) Här är vad jag gjorde ifall någon annan stöter på samma problem (jag har använt ett exempel på IP-adress men det fungerar för andra datatyper också):

Problem:Din tabell har miljontals poster och du måste lägga till ett index väldigt snabbt

Användning: Överväg att lagra miljontals IP-adresser i en uppslagstabell. Att lägga till IP-adresser borde inte vara ett stort problem men att skapa ett index på dem tar mer än 14 timmar.

Lösning :Partitionera din tabell med MySQL:s partitionering g-strategi

Fall #1:När tabellen du vill ha inte har skapats ännu

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:När tabellen du vill ha redan är skapad. Det verkar finnas ett sätt att använda ALTER TABLE för att göra detta, men jag har ännu inte hittat en korrekt lösning för detta. Istället finns det en något ineffektiv lösning:

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

Infoga dina IP-adresser i den här tabellen. Och skapa sedan den faktiska tabellen 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;

Och så till sist

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

Och där har du... indexering på det nya bordet tog mig ungefär 2 timmar på en 3,2 GHz maskin med 1 GB RAM :) Hoppas detta hjälper.



  1. Hur man arbetar med arv i Entity Framework Core

  2. Hur man visar ett datum i tyskt format i SQL Server (T-SQL)

  3. För många öppna filer fel på Ubuntu 8.04

  4. Använder variabel i SQL LIKE-satsen