sql >> Databáze >  >> RDS >> Mysql

Tabulka s 80 miliony záznamů a přidání indexu trvá více než 18 hodin (nebo navždy)! Co teď?

Ok, ukázalo se, že tento problém byl víc než jen jednoduché vytvoření tabulky, indexování a zapomenutí problému :) Zde je to, co jsem udělal pro případ, že by někdo jiný čelil stejnému problému (použil jsem příklad IP adresy, ale funguje to pro jiné také datové typy):

Problém:Vaše tabulka obsahuje miliony položek a index potřebujete přidat opravdu rychle

Případ použití: Zvažte uložení milionů IP adres do vyhledávací tabulky. Přidání IP adres by neměl být velký problém, ale vytvoření indexu na nich trvá déle než 14 hodin.

Řešení :Rozdělte tabulku pomocí Rozdělení MySQL g strategie

Případ č. 1:Když požadovaný stůl ještě není vytvořen

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;

Případ č. 2:Když je požadovaná tabulka již vytvořena. Zdá se, že existuje způsob, jak to provést pomocí ALTER TABLE, ale ještě jsem nepřišel na správné řešení. Místo toho existuje mírně neefektivní řešení:

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

Do této tabulky vložte své IP adresy. A pak vytvořte skutečnou tabulku s oddíly:

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;

A pak konečně

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

A je to... indexování na novém stole mi na 3,2GHz stroji s 1GB RAM trvalo asi 2 hodiny :) Doufám, že to pomůže.



  1. Vyhledávání chybového čísla zprávy

  2. chyba oddělovače mysql

  3. MySQL datový typ INT (11), zatímco UNSIGNED INT (10)?

  4. Jak povolím protokol pomalých dotazů MySQL?