В настоящее время я выполняю запрос на изменение в моей таблице (20 миллионов записей), чтобы добавить индекс. он работает уже более 3 дней (застрял на «копировать в таблицу TMP»).
Есть ли способ узнать ход выполнения запроса или, другими словами, есть ли способ узнать время выполнения?
Благодарю.
SHOW CREATE TABLE tblname\G
на столе и сообщите нам индекс, который вы хотите сделать.Ответы:
Когда mysql изменяет таблицу, он, по сути, создает ее копию, а затем заменяет копию. Таким образом, если вы отмените обновление в середине, таблица все еще находится в стабильном состоянии. Таким образом, вы можете заглянуть в каталог данных mysql (/ var / lib / mysql /?), Чтобы увидеть, насколько велик новый файл, который скажет вам, как далеко он находится. С Innodb это немного сложнее, но где-то создается таблица tmp.
Вы можете значительно сократить количество времени, которое занимает индекс, увеличив переменные буфера сортировки (myisam_sort_buffer_size, sort_buffer_size). Сделайте их настолько большими, насколько сможете, используя имеющуюся у вас память. Вы можете сократить время модификации на несколько дней, даже сократить его до нескольких часов в зависимости от того, сколько у вас памяти. Я сделал 150M таблицу рекордов примерно за 3 часа.
источник
Поскольку innodb_fle_per_table выключен, вы не можете увидеть таблицу и измерить ее ход.
Я сделал предыдущий пост о том, как сделать это для MyISAM . Вы можете сделать это для InnoDB, если и только если innodb_file_per_table был включен, и вы реорганизуете инфраструктуру InnoDB . Это все еще требует, чтобы смотреть в операционной системе на размеры файлов, о которых идет речь.
После того как вы полностью внедрили очистку InnoDB и включили innodb_file_per_table, вы можете выполнить обновление индекса следующим образом:
ПРИМЕР у вас есть следующее
db.lotsofdata
с 20 миллионами имен:Таблица выглядит так:
Предположим, вы хотите создать индекс имени. Ты можешь сделать это:
Пока INSERT работает, вы заходите в операционную систему и запускаете это:
Это даст вам список текущего размера
lotsofdata_new.ibd
. Когда он становится больше чемlotsofdata.ibd
, тогда вы знаете, что близки к завершению.Кстати, MariaDB имеет статус прогресса, реализованный внутри .
источник
Нет надежного способа увидеть прогресс в создании индекса. Если у вас был innodb-file-per-table, вы могли бы получить некоторую информацию, посмотрев на временный файл .ibd, который создается в каталоге данных, и сравнив его с размером текущего файла, но это не очень надежный, поскольку ваш текущий файл данных может быть раздутым из-за удалений / фрагментации, а новый файл данных будет иметь дополнительный индекс, которого не было у вашего предыдущего.
Похоже, вы используете версию MySQL без установленного плагина InnoDB . Плагин InnoDB имеет быстрое создание индекса, который не требует полной перестройки таблицы для добавления и удаления индексов. Плагин InnoDB включен по умолчанию в MySQL 5.5 и доступен с настройкой конфигурации в 5.1.38 и более поздних версиях.
Percona Server довольно давно (до 5.5) включил плагин InnoDB по умолчанию.
источник
pt-online-schema-change от Percona показывает оценку оставшегося времени. По умолчанию он выводит оценку оставшегося времени и процент выполнения каждые 30 секунд.
Он также имеет дополнительные функции по сравнению с простым выполнением команды ALTER.
http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html
источник