Mysql
 sql >> база данни >  >> RDS >> Mysql

Таблица с 80 милиона записа и добавянето на индекс отнема повече от 18 часа (или завинаги)! Сега какво?

Оказа се, че този проблем е нещо повече от просто създаване на таблица, индексиране и забравяне на проблема :) Ето какво направих, в случай че някой друг се сблъска със същия проблем (използвах пример за IP адрес, но работи за други типове данни също):

Проблем:Вашата таблица има милиони записи и трябва да добавите индекс много бързо

Случай на употреба: Помислете за съхранение на милиони IP адреси в таблица за търсене. Добавянето на IP адресите не трябва да е голям проблем, но създаването на индекс върху тях отнема повече от 14 часа.

Решение :Разделете таблицата си с помощта на MySQL's Partitionin g стратегия

Случай №1:Когато таблицата, която искате, все още не е създадена

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;

Случай №2:Когато таблицата, която искате, вече е създадена. Изглежда, че има начин да се използва ALTER TABLE, за да се направи това, но все още не съм намерил правилното решение за това. Вместо това има малко неефективно решение:

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

Въведете вашите IP адреси в тази таблица. И след това създайте действителната таблица с дялове:

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;

И накрая

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

И ето... индексирането на новата таблица ми отне около 2 часа на 3.2GHz машина с 1GB RAM :) Надявам се това да помогне.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL LEFT JOIN дублира резултатите

  2. Как да намерите местоположението на базата данни на MySQL на вашия твърд диск?

  3. Грешка в MySQL/PHP:[2002] Само едно използване на всеки адрес на сокет (протокол/мрежов адрес/порт) обикновено е разрешено

  4. Използване на select в локална променлива и подготвен оператор в mysql

  5. MySQL - SELECT * INTO OUTFILE LOCAL ?