Dodawanie indeksu bardzo wolno… czy istnieje polecenie cmdq mysql, aby uzyskać ETA lub pokazać postęp?

13

Obecnie uruchamiam zapytanie alter w mojej tabeli (20 mln wpisów) w celu dodania indeksu. działa już ponad 3 dni (utknął na „kopiuj do tabeli tmp”).

czy jest sposób, aby zobaczyć postęp zapytania lub innymi słowy, czy jest sposób, aby uzyskać szacunkowy czas zakończenia?

dzięki.

Atai Voltaire
źródło
4
MyISAM? InnoDB? Jeśli InnoDB jest włączony, plik na tabelę jest włączony?
Charles
Wielkie pytanie - Najlepsze, co mogę myśleć od razu jest, aby z grubsza domyślać pomocą wielkości surowych plików tymczasowych i rzeczywistych - zrobi trochę więcej badań, choć
Proszę SHOW CREATE TABLE tblname\Gna stole i powiedz nam indeks, który chcesz zrobić.
RolandoMySQLDBA

Odpowiedzi:

3

Kiedy mysql zmienia tabelę, zasadniczo tworzy jej kopię, a następnie zamienia kopię. W ten sposób, jeśli anulujesz aktualizację w środku, tabela nadal będzie w stanie stabilnym. Możesz więc zajrzeć do katalogu danych mysql (/ var / lib / mysql /?), Aby zobaczyć, jak duży jest nowy plik, który pokaże ci, jak daleko jest on dalej. Jest to nieco trudniejsze w przypadku Innodb, ale gdzieś tworzona jest tabela tmp.

Możesz znacznie skrócić czas indeksowania, zwiększając zmienne bufora sortowania (myisam_sort_buffer_size, sort_buffer_size). Zrób tak duże, jak to możliwe, dzięki posiadanej pamięci. Możesz skrócić o kilka dni czas modyfikacji, a nawet skrócić go do kilku godzin, w zależności od ilości pamięci. Zrobiłem tabelę rekordów 150 mln w około 3 godziny.


źródło
Niestety nie udało mi się znaleźć żadnej tabeli tmp. Korzystam z innoDB, z ustawieniem innodb_file_per_table na OFF.
2

Ponieważ innodb_fle_per_table jest WYŁĄCZONY, nie możesz zobaczyć tabeli i zmierzyć jej postępu.

Wcześniej napisałem o tym, jak to zrobić dla MyISAM . Możesz to zrobić dla InnoDB tylko wtedy, gdy włączona jest opcja innodb_file_per_table i ponownie zarchiwizujesz infrastrukturę InnoDB . Nadal wymaga spojrzenia w systemie operacyjnym na rozmiary danych plików.

Po pełnym wdrożeniu czyszczenia programu InnoDB i włączeniu pliku innodb_file_per_table możesz zaktualizować indeks w następujący sposób:

PRZYKŁAD masz następujące

  • Instancja MySQL z / var / lib / mysql jako datadir
  • Wywołano tabelę InnoDB db.lotsofdataz 20 milionami nazw:

Tabela wygląda następująco:

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

Załóżmy, że chcesz utworzyć indeks nazw. Możesz to zrobić:

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;

Podczas działania INSERT, wchodzisz do systemu operacyjnego i uruchamiasz to:

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

To daje listę aktualnego rozmiaru lotsofdata_new.ibd. Kiedy staje się większy niż lotsofdata.ibd, wtedy wiesz, że jesteś bliski ukończenia.

BTW MariaDB ma wewnętrznie wdrożony Status Postępu .

RolandoMySQLDBA
źródło
dzięki za informacje zwrotne. na razie postanowiłem zabić zapytanie i spróbować ponownie po aktualizacji do ostatniej wersji mysql. mam nadzieję, że w ten sposób pójdzie to płynniej.
Atai Voltaire,
1

Nie ma niezawodnego sposobu na sprawdzenie postępu tworzenia indeksu. Jeśli masz plik innodb-file-per-table, możesz uzyskać pewne wskazówki, patrząc na tymczasowy plik .ibd, który jest tworzony w katalogu danych i porównuje go z rozmiarem bieżącego pliku, ale to nie jest bardzo wiarygodne, ponieważ twój obecny plik danych może być rozdęty z powodu usuwania / fragmentacji, a nowy plik danych będzie miał dodatkowy indeks, którego poprzedni nie miał.

Wygląda na to, że używasz wersji MySQL bez zainstalowanej wtyczki InnoDB . Wtyczka InnoDB umożliwia szybkie tworzenie indeksu, który nie wymaga pełnej przebudowy tabeli w celu dodawania i usuwania indeksu. Wtyczka InnoDB jest domyślnie włączona w MySQL 5.5 i dostępna z ustawieniem konfiguracji w 5.1.38 i późniejszych.

  • Jakiej wersji MySQL używasz?

Serwer Percona na wiele sposobów (wcześniej niż 5.5) ma domyślnie włączoną wtyczkę InnoDB.

Aaron Brown
źródło