16 Jan 2008

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ć:

UWAGA: Ten sposób został sprawdzony wyłącznie na tabelach typu MyISAM!!!

  1. 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
  2. Modyfikujemy odpowiednio strukturę danych (dodajemy indexy)
  3. Wyłączamy serwer MySQL
  4. Kopiujemy plik .MYD starej tabeli do nowej
    cp x.MYD x_new.MYD
    (w tej chwili baza danych jest niespójna, wiec ... )
  5. Uruchamiamy:
    mysqlcheck --repair --use-frm nazwa_bd nazwa_nowej_tabeli
    mysqlcheck --repair --use-frm test x_new
    
  6. 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.
  7. 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.

Hints:

CREATE TABLE new_aa ( SHOW CREATE TABLE aa );

Hints2:

INSERT INTO ... SELECT * FROM table

No comments:

Post a Comment