mysql - ile kolumn to za dużo?


111

Konfiguruję tabelę, która może mieć maksymalnie 70 kolumn. Zastanawiam się teraz nad podzieleniem go, ponieważ niektóre dane w kolumnach nie będą potrzebne przy każdym dostępie do tabeli. Z drugiej strony, jeśli to zrobię, będę musiał używać złączeń.

Czy w którym momencie, jeśli w ogóle, uważa się, że jest za dużo kolumn?


6
Nie musimy przez cały czas używać SELECT *. Zawsze mamy możliwość wybrania tylko kolumn, które są nam potrzebne w danej sytuacji.
— APC

3
70 kolumn ?! Ile z nich nie może być zerowych?
— OMG Kucyki

1
Najważniejsze pytanie brzmi: czy normalizujesz swoje stoły? 70 to niezwykła kwota, chyba że celowo denormalizujesz wydajność (bardzo niewiele rzeczy ma 70 unikalnych atrybutów). Jeśli denormalizujesz ze względu na wydajność, zgodziłbym się z ChssPly76, że możesz użyć wszystkiego, na co pozwoli Ci baza danych.
— Godeke

2
@KM. czy to ma być żart? Jestem nowy w MySQL i nie mogę go zrozumieć, czy masz na myśli, że JOIN jest dobrą rzeczą, czy czymś, czego należy unikać?
— Elia Iliashenko

2
O ile łączenia są podstawową częścią SQL, dołączanie w celu dołączenia prawdopodobnie obniży wydajność i łatwość utrzymania dowolnej aplikacji.
— jeteon

Odpowiedzi:


142

Jest uważany za zbyt wiele, gdy przekracza maksymalny limit obsługiwany przez bazę danych .

Fakt, że każde zapytanie nie musi zwracać każdej kolumny, jest całkowicie normalny; dlatego instrukcja SELECT umożliwia jawne nazwanie potrzebnych kolumn.

Zgodnie z ogólną zasadą struktura tabeli powinna odzwierciedlać model domeny; jeśli naprawdę masz 70 (100, co masz) atrybutów należących do tej samej encji, nie ma powodu, aby rozdzielać je na wiele tabel.


29
@KM - dlatego powiedziałem „atrybuty należące do tej samej jednostki w modelu domeny”. Duża liczba kolumn w tabeli NIE powoduje jej zdenormalizowania; liczy się to, co przedstawiają wspomniane kolumny. Poza tym, chociaż normalizacja jest zdecydowanie dobrą rzeczą, NIE jest ona rozwiązaniem wszystkich problemów życiowych. Podstępne pytanie - czy uważasz, że liczba głosów obok pytania / odpowiedzi SO jest obliczana jak za select count(*) from voteskażdym razem, czy myślisz, że być może jest zdenormalizowana? Czy to sprawia, że ​​baza danych SO jest zła, a Jeff Atwood szalony?
— ChssPly76

@ ChssPly76, to relacyjna baza danych, a nie model obiektowy. istnieją tabele, wiersze i kolumny, pracuj w ramach tego ograniczenia, jeśli chcesz uzyskać maksymalną wydajność, naśladuj obiekty dla wygody ze względu na wydajność. Czy zatem każda informacja o osobie powinna być przechowywana w tym samym wierszu? nie, podziel je i pogrupuj w różne tabele (na przykładzie mojego poprzedniego komentarza): „Osoba”, „Działania” „HealthRecords”. Przechowywanie SUMY ze względu na wydajność jest zupełnie innym problemem niż przechowywanie wszystkich danych w 70 kolumnach, aby uniknąć łączenia.
— KM.

20
Czy „numberOfTeethPulled” powinien być częścią rekordu Person? Nie, prawdopodobnie nie powinno być w ogóle przechowywane - otrzymasz te informacje z „ToothExtractionRecord”, jeśli Twój model domeny wymaga takiego poziomu szczegółowości. Ale to TWÓJ (i ośmielę się powiedzieć, raczej wymyślny) przykład - nie ma to nic wspólnego z moim punktem widzenia: duża liczba kolumn w tabeli NIE oznacza, że ​​tabela jest zdenormalizowana. Pomyśl o umowach dotyczących nieruchomości / zamówieniach / innych dokumentach finansowych, żeby wymienić tylko kilka przykładów. Czy można je dalej podzielić na wiele tabel? Tak. Jakiś powód, żeby to zrobić? Nie całkiem.
— ChssPly76

1
+1, to było zabawne. Jeśli tworzysz kolejną tabelę i będzie to po prostu relacja 1: 1, prawdopodobnie po prostu umieść ją w głównej tabeli. Nie pozwoli to zaoszczędzić miejsca, nie będzie działać o wiele lepiej, jeśli nie zażądasz danych, a nie będzie ich w ogóle w tabeli. Jedynym uzasadnionym powodem, który przychodzi mi teraz na myśl, jest to, że są tam poufne informacje, takie jak
— numer PESEL

1
Jeśli mam jedną tabelę z 15 kolumnami, a drugą 300 kolumnami, klucz podstawowy obu tabel jest taki sam. Wybierz jedną kolumnę z dwóch tabel, czy wydajność będzie się znacznie różnić?
— oferta nie może odmówić

28

Istnieją pewne korzyści z podzielenia tabeli na kilka z mniejszą liczbą kolumn, co jest również nazywane partycjonowaniem pionowym . Tu jest kilka:

  1. Jeśli masz tabele z wieloma wierszami, modyfikowanie indeksów może zająć bardzo dużo czasu, ponieważ MySQL musi odbudować wszystkie indeksy w tabeli. Podział indeksów na kilka tabel może to przyspieszyć.

  2. W zależności od zapytań i typów kolumn MySQL może zapisywać tymczasowe tabele (używane w bardziej złożonych zapytaniach wybierających) na dysk. To jest złe, ponieważ dysk I / O może być wielką szyjką butelki. Dzieje się tak, jeśli zapytanie zawiera dane binarne (tekst lub obiekt blob).

  3. Szersza tabela może spowodować wolniejszą wydajność zapytań.

Nie optymalizuj przedwcześnie, ale w niektórych przypadkach możesz uzyskać ulepszenia dzięki węższym tabelom.


5
Dlaczego MySQL musi odbudować wszystkie indeksy w tabeli, jeśli tylko jeden jest modyfikowany?
— Petr Peller

Zastanawiałem się nad tym samym. Dlaczego MySQL odbudowuje wszystkie indeksy w tabeli? Czy powyższe stwierdzenie jest prawidłowe?
— maj

13

Jest ich za dużo, gdy narusza zasady normalizacji. Uzyskanie tak wielu kolumn jest dość trudne, jeśli normalizujesz bazę danych. Zaprojektuj bazę danych, aby modelować problem, a nie wokół sztucznych reguł lub pomysłów dotyczących optymalizacji pod kątem konkretnej platformy bazy danych.

Zastosuj następujące reguły do ​​szerokiego stołu, a prawdopodobnie będziesz mieć znacznie mniej kolumn w jednej tabeli.

  1. Brak powtarzających się elementów lub grup elementów
  2. Brak częściowych zależności od konkatenowanego klucza
  3. Brak zależności od atrybutów niebędących kluczami

Oto link, który pomoże Ci w tym.


17
It is pretty hard to get that many columns if you are normalizing your database.Nie tak trudne, jak się wydaje.
— Petr Peller

5
Zdecydowanie nie jest to takie trudne. Wydaje się, że ludzie nie rozumieją normalnych form występujących wokół tych części. Możesz mieć 10000 kolumn i STILL być znormalizowane (nawet do najwyższej normalnej postaci).
— Hejazzman

2
@foljs I właśnie w tym miejscu pojawia się przyjęta praktyka denormalizacji. Jeśli jesteś na skrzyżowaniu i samochód ma wjechać w ciebie, byłoby głupio czekać, aż światło zmieni się na zielone. Musisz zejść z drogi. Podczas gdy przejście przez czerwone światło może technicznie nie być legalne, robisz to, co oczywiście powinieneś zrobić, biorąc pod uwagę sytuację = denormalizacja
— user3308043

3
Straciłeś mnie, kiedy zacząłeś mówić o samochodach. Nie mam pojęcia, jakie to ma znaczenie.
— JohnFx

2
Jednak jak w tym scenariuszu wykonywać złożone zapytania z pojedynczą tabelą danych, nie możesz, musisz w dużym stopniu polegać na języku programowania i różnorodności innych rzeczy, aby to zadziałało! Więc równie dobrze mógłbym wrócić do tabeli zawierającej 170 kolumn, ponieważ posiadanie zapytań „JOIN” i bardzo skomplikowanego programowania, które wymaga tworzenia oddzielnych tabel, wydaje mi się stratą czasu. Chyba jestem wielkim fanem zasady KISS.
— Vlad Vladimir Hercules

0

Nie stanowi to problemu, chyba że wszystkie atrybuty należą do tej samej jednostki i nie są od siebie zależne. Aby ułatwić życie, możesz mieć jedną kolumnę tekstową z przechowywaną w niej tablicą JSON. Oczywiście, jeśli nie masz problemu z uzyskaniem wszystkich atrybutów za każdym razem. Chociaż całkowicie zniweczyłoby to cel przechowywania go w RDBMS i znacznie skomplikowałoby każdą transakcję w bazie danych. Dlatego nie jest to zalecane podejście do stosowania w całej bazie danych.


0

Zbyt wiele kolumn w tej samej tabeli może również powodować ogromne problemy w replikacji. Powinieneś wiedzieć, że zmiany, które zaszły w master, będą replikowane na slave ... na przykład, jeśli zaktualizujesz jedno pole w tabeli, cały wiersz będzie w

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.