Mysql - Fast index creation¶
Pisząc nawet niewielkie aplikacje webowe w miarę wypełniania ich danymi zachodzi potrzeba dodania nowych indeksów to tablic w bazie MySQL, zadanie to nie jest szybkie jeśli nasza tablica ma juz w okolicach miliona rekordów, ponieważ zwyczajne:
ALTER TABLE tbl_name ADD KEY col_name;
ALTER TABLE tbl_name ADD KEY key_name ( tbl_name, tbl_name, ... );
Trwa bardzo długo, trzeba było wymyślić inny sposób zrobienia takiego zadania.
Okazało sie, ze jeden z moich znajomych miał również taki problem, wiec polecił mi (wymagany jest dostęp do zapisu do plików bazy danych), domyślnie na serwerach wirtualnych czegoś takiego sie nie udostępnia, natomiast jeśli mamy serwer dedykowany i konto roota to jesteśmy w stanie bez problemu to przeprowadzić:
Ostrzeżenie
Ten sposób został sprawdzony wyłącznie na tabelach typu MyISAM!!!
Tworzymy tabele o takim samym schemacie, ale o nowej nazwie czyli, mamy tablice x stworzymy sobie:
CREATE TABLE x_new ( ... ) ; -- odpowiednio to uzupełniając
Modyfikujemy odpowiednio strukturę danych (dodajemy indexy)
Wyłączamy serwer MySQL
Kopiujemy plik .MYD starej tabeli do nowej
cp x.MYD x_new.MYD
w tej chwili baza danych jest niespójna, wiec …
Uruchamiamy:
mysqlcheck --repair --use-frm nazwa_bd nazwa_nowej_tabeli
mysqlcheck --repair --use-frm test x_new
No to indeksy są właśnie tworzone, jakimś szybszym sposobem – zapewne wynika to z tego, że dane nie muszą być ciągle dostępne.
Cieszymy sie indeksami
Dlaczego tak sie dzieje, wygląda na to ze robiąc zapytanie ALTER TABLE
jest tworzona tymczasowa tablica wg której jest liczony nowy index.
Informacja
CREATE TABLE new_aa ( SHOW CREATE TABLE aa );
INSERT INTO ... SELECT * FROM table