Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Tablica z 80 milionami rekordów i dodanie indeksu zajmuje ponad 18 godzin (lub w nieskończoność)! Co teraz?

Ok okazuje się, że ten problem był czymś więcej niż tylko prostym utworzeniem tabeli, zindeksowaniem i zapomnieniem o problemie :) Oto, co zrobiłem na wypadek, gdyby ktoś inny napotkał ten sam problem (użyłem przykładu adresu IP, ale działa dla innych również typy danych):

Problem:Twoja tabela zawiera miliony wpisów i musisz bardzo szybko dodać indeks

Przypadek zastosowania: Rozważ przechowywanie milionów adresów IP w tabeli wyszukiwania. Dodanie adresów IP nie powinno być dużym problemem, ale utworzenie na nich indeksu zajmuje ponad 14 godzin.

Rozwiązanie :Podziel tabelę na partycje za pomocą partycjonowania MySQL strategia g

Przypadek 1:Gdy żądana tabela nie została jeszcze utworzona

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;

Przypadek 2:Gdy odpowiednia tabela jest już utworzona. Wydaje się, że istnieje sposób na użycie ALTER TABLE, aby to zrobić, ale nie znalazłem jeszcze odpowiedniego rozwiązania tego problemu. Zamiast tego istnieje nieco nieefektywne rozwiązanie:

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

Wstaw swoje adresy IP do tej tabeli. A następnie utwórz rzeczywistą tabelę z partycjami:

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;

I wreszcie

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

No i proszę… indeksowanie na nowym stole zajęło mi około 2 godzin na maszynie 3,2 GHz z 1 GB pamięci RAM :) Mam nadzieję, że to pomoże.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lexing częściowego SQL w C#

  2. PHP SQL :Jak zapisać dane do wielu baz danych z jednego formularza html LUB jak automatycznie skopiować dane z jednej bazy danych do innej bazy danych

  3. Jak połączyć bazę danych MySql z Firebase?

  4. jqGrid - Unikalny identyfikator dla nowego wiersza

  5. Wielokrotna próba zamówienia stołu