Muszę utworzyć indeks na ~ 5M wierszy tabeli MySQL. To jest stół produkcyjny i obawiam się, że będzie kompletny blok wszystkiego, jeśli uruchomię instrukcję CREATE INDEX ...
Czy istnieje sposób na utworzenie tego indeksu bez blokowania wstawień i selekcji?
Zastanawiam się tylko, czy nie muszę przerywać, tworzyć indeksu i restartować systemu!
mysql
indexing
production
alter-table
table-locking
n0cturnal
źródło
źródło
Odpowiedzi:
Aktualizacja [2017]: MySQL 5.6 obsługuje aktualizacje indeksów online
https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-operations.html#online-ddl-index-syntax-notes
[2015] Aktualizacja tabeli wskazuje na bloki zapisów w MySQL 5.5
Z powyższej odpowiedzi:
To jest **** FALSE **** (przynajmniej dla tabel MyISAM / InnoDB, których używa 99,999% ludzi. Wersja Clustered jest inna).
Wykonywanie operacji UPDATE na tabeli spowoduje ZABLOKOWANIE podczas tworzenia indeksu. MySQL jest naprawdę głupi w tym (i kilku innych rzeczach).
Skrypt testowy:
Mój serwer (InnoDB):
Dane wyjściowe (zwróć uwagę, jak szóste bloki operacji przez ~ 400 ms potrzebne do zakończenia aktualizacji indeksu):
W porównaniu z operacjami odczytu, które nie blokują (zamień komentarz linii w skrypcie):
Aktualizacja schematu MySQL bez przestojów
Tak więc, jest tylko jedna metoda, którą znam, aby zaktualizować schemat MySql i uniknąć przerwy w dostępności. Mistrzowie cyrkularni:
Prosty sposób na aktualizację schematu to nie jest. Wykonalne w poważnym środowisku produkcyjnym; Tak to jest. Proszę, proszę, proszę, jeśli istnieje łatwiejszy sposób na dodanie indeksu do tabeli MySQL bez blokowania zapisów, daj mi znać.
Googlowanie doprowadziło mnie do tego artykułu, w którym opisano podobną technikę. Co więcej, radzą pić w tym samym momencie procedury (zwróć uwagę, że napisałem swoją odpowiedź przed przeczytaniem artykułu)!
Percona's pt-online-schema-change
Artykuł I połączone powyżej opowiada o narzędzia, pt-online-schemat-change , że działa w następujący sposób:
Sam nigdy nie próbowałem tego narzędzia. YMMV
RDS
Obecnie używam MySQL za pośrednictwem RDS firmy Amazon . To naprawdę sprytna usługa, która zarządza MySQL i zarządza nią, umożliwiając dodawanie nowych replik do odczytu za pomocą jednego przycisku i przejrzystą aktualizację bazy danych w różnych jednostkach SKU sprzętu. To naprawdę wygodne. Nie uzyskujesz SUPER dostępu do bazy danych, więc nie możesz wkręcać w replikację bezpośrednio (czy to błogosławieństwo czy przekleństwo?). Możesz jednak skorzystać z promocji Read Replica, aby wprowadzić zmiany w schemacie na urządzeniu podrzędnym tylko do odczytu, a następnie wypromować go na nowego mistrza. Dokładnie ta sama sztuczka, którą opisałem powyżej, tylko znacznie łatwiejsza do wykonania. Nadal nie robią zbyt wiele, aby pomóc ci w cięciu. Musisz ponownie skonfigurować i ponownie uruchomić aplikację.
źródło
Jak pokazuje ten wpis na blogu , InnoDB
ALTER TABLE
mechanizm został całkowicie przeprojektowany dla MySQL 5.6.(Aby uzyskać ekskluzywny przegląd tego tematu, dokumentacja MySQL może zapewnić popołudniową lekturę).
Aby dodać indeks do tabeli bez blokady wynikającej z
UPDATE
/INSERT
, można użyć następującego formatu instrukcji:źródło
Aktualizacja MySQL 5.6 (luty 2013): Możesz teraz wykonywać operacje odczytu i zapisu podczas tworzenia indeksu, nawet z tabelami InnoDB - http://dev.mysql.com/doc/refman/5.6/en/innodb-create-index -overview.html
i:
z http://dev.mysql.com/doc/refman/5.6/en/glossary.html#glos_fast_index_creation
źródło
pt-online-schema-change jest dobrym rozwiązaniem, jeśli naprawdę chcesz się upewnić, że migracja nie spowoduje wyłączenia witryny.
Jak napisałem w powyższym komentarzu, mam kilka doświadczeń z pt-online-schema-change w produkcji. Mamy naszą główną tabelę zawierającą ponad 20 milionów rekordów i główną -> 2 niewolników replikacji tylko do odczytu. Zrobiłem co najmniej kilkadziesiąt migracji z pt-online-schema-change od dodania nowej kolumny, zmiany zestawu znaków, do dodania kilku indeksów. Obsługujemy tony ruchu również w czasie migracji i nie mieliśmy żadnych problemów. Oczywiście przed uruchomieniem w środowisku produkcyjnym musiałbyś bardzo dokładnie przetestować wszystkie skrypty.
Próbowałem podzielić zmiany w jednym skrypcie, aby zmiana schematu pt-online musiała tylko raz skopiować dane. Zachowaj ostrożność przy zmianie nazwy kolumny, ponieważ utracisz swoje dane. Jednak dodanie indeksu powinno wystarczyć.
źródło
pt-online-schema-change
. Jest świetny, ale jest przesadą w wielu sytuacjach, w których funkcje DDL online MySQL 5.6 + już działają dobrze. Ma również ograniczenia (takie jak brak dobrej zabawy z wyzwalaczami) i podwaja ilość zapisów potrzebnych na wstawienie do oryginalnej tabeli, gdy trwa zmiana schematu. Obciąży to dysk znacznie bardziej niż zwykła zmiana schematu online, a więc może „obniżyć poziom witryny” w okolicznościach, w których samo uruchomienie schematu w prosty sposób działałoby dobrze.pt-online-schema-change
jest to przydatne narzędzie, jest bardzo wiele sytuacji, w których zwykłe internetowe DDL jest równie dobre i kilka, w których jest lepsze, więc wszelkie zalecenia dotyczące tego powinny być ostrożnie zastrzegane, a nie uniwersalne.