Czy „CREATE INDEX” w MySQL jest operacją liniową?

20

Mam na myśli następujące:

Jeśli tworzenie indeksu w tabeli z nwierszami wymaga tczasu. Czy utworzenie indeksu na tym samym stole 1000*nzajmie około 1000*tczasu.

Staram się oszacować czas potrzebny do utworzenia indeksu w produkcyjnej bazie danych poprzez utworzenie tego samego indeksu w znacznie mniejszej testowej bazie danych.

Nifle
źródło

Odpowiedzi:

16

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.

David Spillett
źródło
7

Warto również zauważyć, że jeśli możesz rozdzielić wrzeciona dla indeksów od wrzecion dla tabeli, będziesz mógł pracować z dwóch dysków jednocześnie (nadal będzie ograniczony do prędkości kontrolera dysku na środku, jeśli RAID lub podobny, ale nadal będzie szybszy niż jeden dysk).

Zdaję sobie sprawę, że tworzenie indeksu nie jest całkowicie operacją „symul-odczyt-zapis”, ale znacznie przyspiesza.

PRZESTROGI: Sam jestem facetem MSSQL, więc nie jestem pewien co do MySQL, ale muszę sobie wyobrazić, że koncepcja dzielenia wrzecion nie jest specyficzna dla SQLServer i Oracle (tam, gdzie słyszałem o tym również, IIRC ). Po prostu nie wiedziałbym, jak zacząć konfigurować tę koncepcję. Ale w kategoriach SQLServer oznaczałoby to posiadanie oddzielnej grupy plików oprócz PRIMARYi umieszczanie indeksów na innej grupie plików, z inną grupą plików przypisaną do zestawu wrzecion bez udziału PRIMARY(przyznanie położenia wrzeciona w porównaniu z aplikacjami to zupełnie inna historia)

jcolebrand
źródło
1
Prawie to samo w Oracle - tylko grupy plików są nazywane obszarem tabel
Joe
1

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.

Rick James
źródło