Додавання індексу дуже повільно… Чи є mysql cmd, щоб отримати ETA або показати прогрес?


13

Наразі я виконую на своєму столі запит про зміни (20M записів), щоб додати індекс. він працює вже понад 3 дні (застряг на "копіювати в tmp table").

чи є спосіб я бачити хід запиту або іншим словом, чи є спосіб я отримати час оцінки?

Спасибі.


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 Cleanup та увімкнули innodb_file_per_table, можливо, вам потрібно буде оновити індекс так:

ПРИКЛАД: у вас є наступне

  • MySQL Instance з / 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тоді, ви знаєте, що ви готові до завершення.

BTW MariaDB має статус прогресу, реалізований всередині країни .


дякую за відгуки. поки що я вирішив вбити запит і спробувати ще раз після оновлення до останньої версії mysql. сподіваємось, це піде більш гладко таким шляхом.
Атай Вольтер

1

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

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

  • Яку версію MySQL ви використовуєте?

Percona Server повертається досить дорогими способами (до 5.5), які за умовчанням увімкнено плагін InnoDB.


0

pt-он-лайн-зміна схем за Percona показує оцінку часу, що залишився. За замовчуванням він виводить решту прогнозу часу та відсотка прогресу кожні 30 секунд.

Він також має додаткові функції порівняно з просто виконанням команди ALTER.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.