Сколько времени нужно, чтобы построить индекс, используя ALTER TABLE в MySQL? - PullRequest
7 голосов
/ 15 февраля 2010

Это может быть немного похоже на вопрос о длине строки, но статистика:

  • Двухъядерный процессор Intel 4GB RAM
  • Таблица с 8 миллионами строк, ~ 20 столбцами, в основном varchars с первичным идентификатором auto_increment
  • Запрос: ALTER TABLE my_table ADD INDEX my_index (my_column);
  • my_column is varchar (200)
  • Память MyISAM

Порядок величин, это должно быть 1 минута, 10 минут, 100 минут?

Спасибо

Редактировать: ОК, это заняло 2 часа 37 минут, по сравнению с 0 часами 33 минутами на машинах меньшей спецификации с практически идентичными настройками. Я понятия не имею, почему это заняло так много времени. Единственная возможность состоит в том, что прод-машина HD заполнена на 85%, а 100 ГБ свободны. Этого должно быть достаточно, но я думаю, это зависит от того, как распределяется свободное пространство.

Ответы [ 3 ]

6 голосов
/ 15 февраля 2010

Если вы просто добавляете один индекс, это займет около 10 минут. Однако это займет 100 минут или больше, если у вас нет этого индексного файла в памяти.

Ваш 200 varchar с 8 миллионами строк займет максимум 1,6 ГБ, но с учетом всех накладных расходов на индексацию это займет около 2-3 ГБ. Но это займет меньше, если большинство строк будет содержать менее 200 символов. (Вы можете выбрать sum(length(my_column)), чтобы узнать, сколько места требуется.)

Вы хотите отредактировать файл /etc/mysql/my.cnf. Играйте с этими настройками;

myisam_sort_buffer_size = 100M
sort_buffer_size = 100M

Удачи.

1 голос
/ 15 февраля 2010

В моей тестовой базе данных MusicBrainz таблица track создает PRIMARY KEY и три вторичных индекса за 25 минуты:

CREATE TABLE `track` (
  `id` int(11) NOT NULL,
  `artist` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `gid` char(36) NOT NULL,
  `length` int(11) DEFAULT '0',
  `year` int(11) DEFAULT '0',
  `modpending` int(11) DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `gid` (`gid`),
  KEY `artist` (`artist`),
  KEY `name` (`name`)
) DEFAULT CHARSET=utf8

В таблице 9001870 записей.

Машина Intel(R) Core(TM)2 CPU 6400 @ 2.13GHz с 2Gb RAM, Fedora Core 12, MySQL 5.1.42.

@@myisam_sort_buffer_size - это 256M.

1 голос
/ 15 февраля 2010

Кроме того, если вам когда-либо понадобится создать несколько индексов, лучше всего создавать все индексы за один вызов, а не по отдельности ... Причина: в основном это означает, что все страницы индекса переписываются так, чтобы они включали ваш новый индекс с чем-либо ещеэто было.Я обнаружил это в прошлом, имея таблицу 2+ гигов, и мне нужно было построить около 15 индексов.Построение всего индивидуально увеличивалось во времени между каждым индексом.Тогда попытка выполнить все сразу была чуть более чем 3 отдельными индексами, поскольку она строила все для каждой записи и записывала все сразу, вместо того, чтобы продолжать перестраивать страницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...