Добавление индекса очень медленное ... есть ли mysql cmd, чтобы получить ETA или показать прогресс?

13

В настоящее время я выполняю запрос на изменение в моей таблице (20 миллионов записей), чтобы добавить индекс. он работает уже более 3 дней (застрял на «копировать в таблицу TMP»).

Есть ли способ узнать ход выполнения запроса или, другими словами, есть ли способ узнать время выполнения?

Благодарю.

Атай Вольтер
источник
4
MyISAM? InnoDB? Если InnoDB, включен ли файл на таблицу?
Чарльз
Отличный вопрос - лучшее, что я могу придумать мгновенно, - это сделать приблизительное предположение, используя размер необработанных временных и фактических файлов, - но проведу еще несколько исследований
Пожалуйста, SHOW CREATE TABLE tblname\Gна столе и сообщите нам индекс, который вы хотите сделать.
RolandoMySQLDBA

Ответы:

3

Когда mysql изменяет таблицу, он, по сути, создает ее копию, а затем заменяет копию. Таким образом, если вы отмените обновление в середине, таблица все еще находится в стабильном состоянии. Таким образом, вы можете заглянуть в каталог данных mysql (/ var / lib / mysql /?), Чтобы увидеть, насколько велик новый файл, который скажет вам, как далеко он находится. С Innodb это немного сложнее, но где-то создается таблица tmp.

Вы можете значительно сократить количество времени, которое занимает индекс, увеличив переменные буфера сортировки (myisam_sort_buffer_size, sort_buffer_size). Сделайте их настолько большими, насколько сможете, используя имеющуюся у вас память. Вы можете сократить время модификации на несколько дней, даже сократить его до нескольких часов в зависимости от того, сколько у вас памяти. Я сделал 150M таблицу рекордов примерно за 3 часа.


источник
К сожалению, я не смог найти ни одной таблицы TMP. Я использую innoDB, где innodb_file_per_table установлен в OFF.
2

Поскольку innodb_fle_per_table выключен, вы не можете увидеть таблицу и измерить ее ход.

Я сделал предыдущий пост о том, как сделать это для MyISAM . Вы можете сделать это для InnoDB, если и только если innodb_file_per_table был включен, и вы реорганизуете инфраструктуру InnoDB . Это все еще требует, чтобы смотреть в операционной системе на размеры файлов, о которых идет речь.

После того как вы полностью внедрили очистку InnoDB и включили innodb_file_per_table, вы можете выполнить обновление индекса следующим образом:

ПРИМЕР у вас есть следующее

  • Экземпляр MySQL с / var / lib / mysql в качестве datadir
  • Таблица InnoDB называется db.lotsofdataс 20 миллионами имен:

Таблица выглядит так:

CREATE TABLE db.lotsofdata
(
    id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(30),
    PRIMARY KEY (id)
) ENGINE=InnoDB;

Предположим, вы хотите создать индекс имени. Ты можешь сделать это:

CREATE TABLE db.lotsofdata_new LIKE db.lotsofdata;
ALTER TABLE db.lotsofdata_new ADD INDEX (name);
INSERT INTO db.lotsofdata_new SELECT * db.lotsofdata;
ALTER TABLE db.lotsofdata RENAME db.lotsofdata_old;
ALTER TABLE db.lotsofdata_new RENAME db.lotsofdata;
TRUNCATE TABLE db.lotsofdata_old;
ALTER TABLE db.lotsofdata_old ENGINE=InnoDB;
DROP TABLE db.lotsofdata_old;

Пока INSERT работает, вы заходите в операционную систему и запускаете это:

cd /var/lib/mysql/db
watch ls -l lotsofda*.ibd

Это даст вам список текущего размера lotsofdata_new.ibd. Когда он становится больше чем lotsofdata.ibd, тогда вы знаете, что близки к завершению.

Кстати, MariaDB имеет статус прогресса, реализованный внутри .

RolandoMySQLDBA
источник
спасибо за ваши отзывы. на данный момент я решил убить запрос и повторить попытку после обновления до последней версии mysql. надеюсь, все пойдет так гладко.
Атай Вольтер
1

Нет надежного способа увидеть прогресс в создании индекса. Если у вас был innodb-file-per-table, вы могли бы получить некоторую информацию, посмотрев на временный файл .ibd, который создается в каталоге данных, и сравнив его с размером текущего файла, но это не очень надежный, поскольку ваш текущий файл данных может быть раздутым из-за удалений / фрагментации, а новый файл данных будет иметь дополнительный индекс, которого не было у вашего предыдущего.

Похоже, вы используете версию MySQL без установленного плагина InnoDB . Плагин InnoDB имеет быстрое создание индекса, который не требует полной перестройки таблицы для добавления и удаления индексов. Плагин InnoDB включен по умолчанию в MySQL 5.5 и доступен с настройкой конфигурации в 5.1.38 и более поздних версиях.

  • Какую версию MySQL вы используете?

Percona Server довольно давно (до 5.5) включил плагин InnoDB по умолчанию.

Аарон Браун
источник
0

pt-online-schema-change от Percona показывает оценку оставшегося времени. По умолчанию он выводит оценку оставшегося времени и процент выполнения каждые 30 секунд.

Он также имеет дополнительные функции по сравнению с простым выполнением команды ALTER.

http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html

Haluk
источник