2010-01-31 8 views
12

Jaka jest różnica przy korzystaniu z tinyint lub smallint (jeśli dotyczy) zamiast tylko int? Lub ograniczając pole char do wymaganych minimalnych znaków?Jak ważne jest wybranie najmniejszego możliwego typu danych podczas projektowania bazy danych?

Czy te wybory wpływają na wydajność lub tylko na przydzieloną przestrzeń?

+1

Jaka jest Twoja taryfa t platforma? Ile rekordów zamierzasz przechowywać? Informacje zawarte w tym pytaniu mogą pomóc w określeniu właściwej odpowiedzi. –

+0

Nie mam konkretnej potrzeby (jeszcze, może już niedługo) po prostu chcę się uczyć –

Odpowiedz

7

W polu indeksowanym ze znacznie większą tabelą rozmiar pola może mieć duży wpływ na wydajność. Na polu nieindeksowanym jego nie tak ważny bit musi jeszcze zapisać dodatkowe dane.

Powiedziawszy, czas przestoju dużego stołu może wynosić kilka minut lub nawet kilka godzin, więc nie należy ich zmniejszać, niż można by przypuszczać.

5

Tak, ma to również wpływ na wydajność.

Jeśli indeksy są większe, odczytanie ich z dysku zajmuje więcej czasu, a mniej można zapisać w pamięci podręcznej.

0

Oba, w niektórych przypadkach. Ale imo, to bardziej kwestia projektowania niż rozważań dotyczących wydajności i przechowywania. Powodem, dla którego nie wszystko robisz, jest to, że nie odzwierciedla dokładnie, jakie dane powinny być tam przechowywane, i zmniejsza integralność danych i bezpieczeństwo typu.

2

ja często widziałem te wady projektowe trzech schematów powodując problemy:

  1. varchar (n) Pole została stworzona za pomocą n tylko wystarczająco duże dla próbki danych, które projektant wysunął się, a nie populacja globalna: drobna w testach jednostkowych, ciche skracania w rzeczywistym świecie.
  2. Warchar (n) używany w przypadku danych o stałym rozmiarze. To maskuje błędy danych.
  3. Znak (n) używany dla danych o zmiennej długości. Zapewnia to poprawę wydajności (poprzez umożliwienie umieszczania danych w linii w rzędzie na dysku, ale cały kod klienta (i różne przechowywane proc/widoki itp.) Muszą radzić sobie z problemami z odstępami białymi (a często nie). Usuwanie marginesów może być trudne do wyśledzenia, ponieważ przestrzenie nie pojawiają się zbyt dobrze, a różne biblioteki/klienci sql je tłumią.

Nigdy nie widziałem dobrego intencji (tj. Nie tylko używania varcharu (255)) dla wszystkich colów), ale konserwatywny wybór niewłaściwego rozmiaru danych powoduje znaczące problemy z wydajnością Przez znaczący, mam na myśli czynnik 10. Regularnie dostrzegam błędy konstrukcyjne algorytmiczne (brakujące indeksy, przesyłanie zbyt dużej ilości danych przez przewód itp.) Większe trafienia wydajnościowe

+0

varchar (255) powinien być dokładnie tak samo skuteczny jak varchar (10), ponieważ rozmiar, to tylko maksymalny rozmiar. Mysql używa tylko tyle bajtów, ile potrzeba do przechowywania zawartości. Różni się to od znaku, w którym mysql używa dokładnie podanej liczby bajtów. –