Tworzenie indeksu jest w zasadzie operacją sortowania , więc w najlepszym wypadku ma n log n
średnio złożoność wzrostu rzędu (w niektórych przypadkach może się okazać, że jest lepsza i prawdopodobnie nie pogorszy się znacznie).
Jeśli wszystkie odpowiednie strony danych mieszczą się w pamięci RAM i są już w pamięci RAM, a indeks również pasuje, a system DBMS nie wymusza zapisania stron indeksu przed zakończeniem tworzenia (więc bloki indeksu nie są aktualizowane na dysku wiele razy podczas operacja), wtedy szybkość zapisywania wynikowego indeksu na dysku będzie większa niż czas potrzebny na wykonanie sortowania - może się okazać, że zbliżasz się do liniowej zależności między liczbą wierszy a czasem tworzenia indeksu - ale jeśli założysz, że jest to gorszy przypadek, prawdopodobnie nie będziesz mile zaskoczony!
Pamiętaj, że jeśli nie zamierzasz przerywać dostępu do produkcyjnej bazy danych podczas operacji, tworzenie dowolnego indeksu będzie konkurowało o przepustowość we / wy i / lub blokuje inną aktywność, więc powinieneś spróbować uwzględnić to, jeśli wykonujesz testy szacowania czasu w innym systemie, nawet jeśli jest identycznie skonfigurowany.
Gdyby to pytanie zostało zadane około 6 lat temu, powiedziałbym zdecydowanie NIE, tak jak w przypadku MySQL 4.x. Jednak MySQL 5.x wykonuje dziś tworzenie indeksów liniowo. Właśnie miałem nostalgiczne doświadczenie, tłumacząc to w mojej odpowiedzi na poprzednie pytanie.
źródło
To zależy.
Zmienna nr 1: Jeśli MySQL zdecyduje się na budowę indeksu (indeksów) w locie lub poczekaj, aż wszystkie dane będą w środku, wykonaj sortowanie itp., Aby zbudować indeks. Uwaga: indeksy UNIQUE (myślę) muszą być budowane w locie, aby można było zweryfikować UNIQUEness. KLUCZ PODSTAWOWY dla InnoDB jest przechowywany z danymi (lub można to powiedzieć odwrotnie), aby MUSI być budowany losowo.
Zmienna nr 2: Indeks śledzi dane (np. AUTO_INCREMENT lub znacznik czasu) w stosunku do losowej (GUID, MD5) lub gdzieś pomiędzy (numer części, imię i nazwisko, przyjaciel_id).
Zmienna nr 3 (jeśli indeks jest budowany „w locie”): Indeks może zmieścić się w pamięci podręcznej (bufor_klucza lub basen_wewnętrzny_bufor) lub może zostać rozlany na dysk.
Indeksy śledzące dane są wydajne i praktycznie liniowe, niezależnie od odpowiedzi na nr 1.
Losowe identyfikatory to ból. Jeśli indeks nie zmieści się w pamięci podręcznej, czas na jego zbudowanie będzie znacznie gorszy niż liniowy, niezależnie od innych zmiennych. (W tym przypadku nie zgadzam się z Rolando.) Ogromna tabela InnoDB z GUID dla PK jest boleśnie powolna, aby WSTAWIĆ do planu na 100 rzędach / s dla zwykłych dysków; może 1000, jeśli masz dyski SSD. ZAŁADUJ DANE i wsadowe WSTAWKI nie dadzą ci spokoju w przypadkowym przechowywaniu.
3.53 do 5.6 - niewiele się zmieniło.
Wiele wrzecion? Stripowanie RAID jest lepsze w prawie każdej sytuacji niż ręczne przypisywanie tego tu i tamtego. Ręczne dzielenie prowadzi do niezrównoważonych sytuacji - skanowanie tabeli utknęło na dysku danych; operacja tylko na indeksie utknęła na dysku indeksu; pojedyncze zapytanie najpierw trafia na dysk indeksu, a następnie dysk z danymi (bez nakładania się); itp.
źródło