Ile wierszy w bazie danych jest ZA DUŻO?


87

Mam tabelę MySQL InnoDB zawierającą 1 000 000 rekordów. Czy to za dużo? Czy bazy danych poradzą sobie z tym i nie tylko? Pytam, ponieważ zauważyłem, że niektóre zapytania (na przykład pobieranie ostatniego wiersza z tabeli) są wolniejsze (sekundy) w tabeli z 1 milionem wierszy niż w przypadku 100.

Odpowiedzi:


114

Mam tabelę MySQL InnoDB z 1000000 rejestrami. Czy to za dużo?

Nie, 1 000 000 wierszy (rekordów AKA) to nie za dużo dla bazy danych.

Pytam, bo zauważyłem, że niektóre zapytania (na przykład uzyskanie ostatniego rejestru tabeli) są wolniejsze (sekundy) w tabeli z 1 milionem rejestrów niż w jednej z 100.

W tym stwierdzeniu jest wiele do wyjaśnienia. Typowi podejrzani to:

  1. Źle napisane zapytanie
  2. Nie używa klucza podstawowego, zakładając, że w ogóle istnieje na stole
  3. Źle zaprojektowany model danych (struktura tabeli)
  4. Brak indeksów

4
5. Nieaktualne specyfikacje serwera <Ostatnia deska ratunku.
Sneakyness

19
@Brimstedt: Zawsze uważałem, że rzeczownik powinien brzmieć „Indeksy”, ale nie sądzę, żebym kiedykolwiek widział, by ktoś go używał do baz danych: od Wikipedii: en.wikipedia.org/w/ ... do Mr. Coding Horror: codinghorror. pl / blog / archives / 000638.html . Jest taki interesujący wpis SO na ten temat: stackoverflow.com/questions/1001366 .
Daniel Vassallo,

7
6. za mało pamięci przydzielonej dla różnych pamięci podręcznych innodb
Jason

aby uzyskać lepszą wydajność, czy muszę używać PrimaryKey? A co z używaniem innych kluczy, takich jak indeks, unikatowy? Czy mogę ich użyć? dzięki
user1844933

Być może komputer jest zapchany pamięcią, jak powiedział Jason, i odcina się w środku procesu
ytpillai

67

Mam bazę danych zawierającą ponad 97 000 000 rekordów ( plik danych 30 GB ) i nie mam problemu.

Pamiętaj tylko, aby zdefiniować i poprawić indeks tabeli .

Więc oczywiste jest, że 1 000 000 to NIE WIELE! (Ale jeśli nie indeksujesz; tak, jest WIELE)


10
Czy dodanie „klucza podstawowego” do kolumny (poprzez wybranie automatycznego zwiększania wartości) byłoby indeksowaniem?
Nathan

8
@Nathan, właściwie kiedy przypiszesz kolumnę jako klucz podstawowy, zostanie ona automatycznie indeksowana, ale każda tabela może mieć tylko jeden klucz podstawowy, jeśli potrzebujesz dodać indeks dla jakiejś kolumny, aby zoptymalizować zapytania, użyj tego stackoverflow.com/ a / 3002635/932473
DAV

Mam tabelę z jednym trylionem, ale wybranie danych w formacie LIFO jest powolne?
Saurabh Chandra Patel

Określ brak problemów. Jak długo trwa najbardziej złożone zapytanie? Mamy tabelę ze 100 milionami wierszy, a klient oczekuje, że zapytania będą wykonywane w maksymalnie 5 sekund, niezależnie od stosowanych przez niego kryteriów grupowania lub porządkowania. Nasze indeksy można ulepszyć, ale zanim wszystko zablokujemy, próbujemy dodać indeks
Joe Yahchouchi

20% tabel produkcyjnych (według starego badania) ma więcej niż 1 mln wierszy. Widziałem kilka z kilkoma miliardami wierszy.
Rick James

19

Użyj opcji „wyjaśnij”, aby zbadać zapytanie i sprawdzić, czy jest coś nie tak z planem zapytania.


6
Chociaż jest to dobry pomysł, ta odpowiedź sama w sobie nie jest dobra dla nowicjusza. Wyjście z EXPLAIN nie jest zbyt intuicyjne ...
nickf

17
Nie ma innego narzędzia, które pomogłoby w badaniu zapytań, więc lepiej zacznij się uczyć EXPLAIN- początkujący lub nie.
nr

30
byłoby miło, gdyby ktoś mógł WYJAŚNIĆ EXPLAIN ;)
Jo E.


15

Myślę, że jest to powszechne nieporozumienie - rozmiar to tylko jedna część równania, jeśli chodzi o skalowalność bazy danych. Istnieją inne problemy, które są trudne (lub trudniejsze):

  • Jak duży jest zestaw roboczy (tj. Ile danych należy załadować do pamięci i aktywnie nad nimi pracować). Jeśli po prostu wstawisz dane i nic z nimi nie zrobisz, jest to w rzeczywistości łatwy problem do rozwiązania.

  • Jaki poziom współbieżności jest wymagany? Czy jest tylko jeden użytkownik wstawiający / czytający, czy też mamy wiele tysięcy klientów działających jednocześnie?

  • Jakie poziomy obietnicy / trwałości i spójności działania są wymagane? Czy musimy się upewnić, że możemy dotrzymać każdego zobowiązania. Czy to w porządku, jeśli średnia transakcja jest szybka, czy też chcemy mieć pewność, że wszystkie transakcje są niezawodnie szybkie (kontrola jakości Six Sigma, np. - http://www.mysqlperformanceblog.com/2010/06/07/performance-optimization- i-six-sigma / ).

  • Czy musisz zrobić jakieś problemy operacyjne, takie jak ZMIENIĆ schemat tabeli? W InnoDB jest to możliwe, ale niezwykle powolne, ponieważ często musi tworzyć tymczasową tabelę na pierwszym planie (blokując wszystkie połączenia).

Więc zamierzam stwierdzić, że dwie kwestie ograniczające to:

  • Twoje własne umiejętności pisania zapytań / posiadanie dobrych indeksów.
  • Ile bólu możesz znieść czekając na instrukcje ALTER TABLE.

2
Edycja: Porady dotyczące tworzenia tabel tymczasowych przez ALTER TABLE są trochę przestarzałe. MySQL 5.5 ma szybkie tworzenie indeksów, a 5.6 ma teraz DDL online.
Morgan Tocker,

3

Jeśli masz na myśli 1 milion wierszy, zależy to od sposobu indeksowania i konfiguracji sprzętu. Milion wierszy to niewielka ilość dla korporacyjnej bazy danych, czy nawet deweloperskiej bazy danych na porządnym sprzęcie.

jeśli masz na myśli 1 milion kolumn (nie jesteś pewien, czy jest to możliwe nawet w MySQL), to tak, wydaje się to trochę duże i prawdopodobnie spowoduje problemy.


3

Zarejestrować? Masz na myśli rekord?

Milion rekordów to obecnie nic wielkiego dla bazy danych. Jeśli napotkasz jakikolwiek problem, prawdopodobnie nie jest to sam system bazy danych, ale raczej sprzęt, na którym go uruchamiasz. Najprawdopodobniej nie napotkasz problemu z bazą danych, zanim zabraknie Ci sprzętu.

Oczywiście niektóre zapytania są wolniejsze od innych, ale jeśli dwa bardzo podobne zapytania działają w bardzo różnym czasie, musisz dowiedzieć się, jaki jest plan wykonania bazy danych i zoptymalizować go, tj. Użyć poprawnych indeksów, właściwej normalizacji itp.

Nawiasem mówiąc, nie ma czegoś takiego jak „ostatni” rekord w tabeli, z logicznego punktu widzenia nie mają one właściwej kolejności.


Mam na myśli coś w stylu „SELECT * FROM table ORDER BY id DESC LIMIT 0”
Juanjo Conti,

4
Może potrzebujesz SELECT LAST_INSERT_ID()zamiast tego zapytania.
True Soft

3

Widziałem tabele niepartycjonowane z kilkoma miliardami (zindeksowanych) rekordów, które same się łączyły w celu pracy analitycznej. Ostatecznie podzieliliśmy to wszystko, ale szczerze mówiąc, nie widzieliśmy tak dużej różnicy.

To powiedziawszy, to było w Oracle i nie testowałem takiej ilości danych w MySQL. Indeksy są Twoim przyjacielem :)


2

Zakładając, że masz na myśli „rekordy” przez „rejestry”, nie, to nie za dużo, MySQL skaluje się naprawdę dobrze i może pomieścić tyle rekordów, ile masz miejsca na dysku twardym.

Oczywiście zapytania wyszukiwania będą wolniejsze. Naprawdę nie ma innego wyjścia, jak tylko upewnienie się, że pola są odpowiednio indeksowane.


2
Z technicznego punktu widzenia rozmiar tabeli może być również ograniczony przez maksymalny rozmiar pliku używanego systemu plików.
tster

0

Im większa tabela (podobnie jak w przypadku większej liczby wierszy), tym wolniejsze zapytania będą zwykle uruchamiane, jeśli nie ma indeksów. Po dodaniu właściwych indeksów wydajność zapytania powinna poprawić się lub przynajmniej nie spaść tak bardzo, jak rośnie tabela. Jeśli jednak samo zapytanie zwróci więcej wierszy, gdy tabela będzie się powiększać, ponownie zaczniesz widzieć degradację.

Chociaż 1 mln wierszy to niewiele, zależy to również od ilości pamięci na serwerze DB. Jeśli tabela jest zbyt duża, aby serwer mógł ją buforować, zapytania będą wolniejsze.


0

Użycie podanego zapytania będzie wyjątkowo powolne ze względu na użycie metody scalania sortowania do sortowania danych.

Zalecałbym ponowne przemyślenie projektu, aby użyć indeksów do jego pobrania lub upewnić się, że jest już uporządkowany w ten sposób, więc nie jest potrzebne sortowanie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.