Ostatnio nauczyłem się cudowności indeksów, a wydajność znacznie się poprawiła. Jednak przy wszystkim, czego się nauczyłem, nie mogę znaleźć odpowiedzi na to pytanie.
Indeksy są świetne, ale dlaczego ktoś nie mógł po prostu zindeksować wszystkich pól, aby tabela była niesamowicie szybka? Jestem pewien, że jest dobry powód, aby tego nie robić, ale co powiesz na trzy pola w tabeli trzydziestopolowej? 10 na 30 polu? Gdzie należy wyznaczyć granicę i dlaczego?
Odpowiedzi:
Indeksy zajmują miejsce w pamięci (RAM); Za dużo lub za dużo indeksów i baza danych będzie musiała wymieniać je na iz dysku. Wydłużają również czas wstawiania i usuwania (każdy indeks musi być aktualizowany dla każdej wstawionej / usuniętej / zaktualizowanej części danych).
Nie masz nieskończonej pamięci. Sprawienie, że wszystkie indeksy mieszczą się w pamięci RAM = dobrze.
Nie masz nieskończonego czasu. Indeksowanie tylko tych kolumn, które chcesz zindeksować, minimalizuje uderzenie wydajności wstawiania / usuwania / aktualizowania.
źródło
Pamiętaj, że każdy indeks musi być aktualizowany za każdym razem, gdy wiersz jest aktualizowany, wstawiany lub usuwany. Więc im więcej masz indeksów, tym wolniejsza wydajność operacji zapisu.
Ponadto każdy indeks zajmuje więcej miejsca na dysku i pamięci (gdy jest wywoływany), więc może również spowolnić operacje odczytu (w przypadku dużych tabel). Sprawdź to
źródło
Musisz zrównoważyć potrzeby CRUD. Pisanie do tabel staje się powolne. Jeśli chodzi o to, gdzie narysować linię, zależy to od sposobu uzyskiwania danych (filtrowanie sortowania itp.).
źródło
Indeksowanie zajmie więcej przydzielonej przestrzeni zarówno z dysku, jak i pamięci RAM, ale także znacznie poprawi wydajność. Niestety, gdy osiągnie limit pamięci, system zrzeknie się miejsca na dysku i zagrozi wydajności. Praktycznie nie powinieneś indeksować żadnego pola, o którym myślisz, że nie obejmuje żadnego algorytmu przechodzenia przez dane, ani wstawiania, ani wyszukiwania (klauzula WHERE). Ale powinieneś, jeśli inaczej. Domyślnie musisz indeksować wszystkie pola. Pola, które powinieneś rozważyć odindeksowanie, to jeśli zapytania są używane tylko przez moderatora, chyba że wymagają również szybkości
źródło
ta odpowiedź jest oparta na mojej osobistej opinii. Do odpowiedzi używam logiki matematycznej
drugie pytanie dotyczyło granicy, na której się zatrzymać, Najpierw zróbmy jakieś obliczenia matematyczne, załóżmy, że mamy N wierszy z L polami w tabeli, jeśli zaindeksujemy wszystkie pola, otrzymamy L nowych tabel indeksowych, w których każda tabela będzie sortowana w w sensowny sposób dane pola indeksu, na pierwszy rzut oka, jeśli twój stół ma wagę W, stanie się W * 2 (1 tera stanie się 2 tera), jeśli masz 100 dużych tabel (pracowałem już w projekcie, w którym numer tabeli był około 1800 stolików) zmarnujesz 100 razy więcej miejsca (100 tera), to jest dalekie od rozsądku.
Jeśli zastosujemy indeksy we wszystkich tabelach, będziemy musieli pomyśleć o aktualizacjach indeksów, w których jedna aktualizacja wyzwoli aktualizację wszystkich indeksów to jest wybór wszystkich nieuporządkowanych odpowiedników w czasie
z tego wnioskuję, że masz w tym scenariuszu, że jeśli stracisz ten czas, lepiej stracić go w selekcji lub aktualizacji, ponieważ jeśli wybierzesz pole, które nie jest indeksowane, nie uruchomisz kolejnego wyboru na wszystkich polach, które są nie indeksowane
co indeksować?
klucze obce: jest koniecznością w oparciu o
klucz główny: nie jestem jeszcze tego pewien, może być, jeśli ktoś przeczyta to, może pomóc w tej sprawie
inne pola: pierwsza naturalna odpowiedź to połowa pozostałych fildów dlaczego: jeśli powinieneś indeksować więcej, nie jesteś daleko od najlepszej odpowiedzi, jeśli powinieneś indeksować mniej, nie jesteś również daleko, ponieważ wiemy, że żaden indeks nie jest zły i wszystkie zindeksowane jest również zły.
z tych 3 punktów mogę wywnioskować, że jeśli mamy pola L złożone z K kluczy, limit powinien być gdzieś blisko
((L-K)/2)+K
mniej więcej o L / 10ta odpowiedź jest oparta na mojej logice i osobistych cenach
źródło
Indeksowanie wszystkich kolumn w tabeli nie jest dobrym pomysłem. Chociaż sprawi to, że odczyt tabeli będzie bardzo szybki, zapisywanie będzie również znacznie wolniejsze. Zapisywanie do tabeli, w której każda kolumna jest indeksowana, wymagałoby umieszczenia nowego rekordu w tej tabeli, a następnie umieszczenia informacji z każdej kolumny w jej własnej tabeli indeksu.
źródło