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.
sql
mysql
database
performance
Juanjo Conti
źródło
źródło
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)
źródło
Użyj opcji „wyjaśnij”, aby zbadać zapytanie i sprawdzić, czy jest coś nie tak z planem zapytania.
źródło
EXPLAIN
- początkujący lub nie.EXPLAIN
;)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:
źródło
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.
źródło
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.
źródło
SELECT LAST_INSERT_ID()
zamiast tego zapytania.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 :)
źródło
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.
źródło
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.
źródło
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.
źródło