2010-07-20 10 views
15

Uczę się o użyciu typów danych dla baz danych.Jak wybrać zoptymalizowane typy danych dla kolumn [specyfikacja innodb]?

Na przykład:

  • co jest lepsze dla poczty elektronicznej? varchar [100], char [100] lub tinyint (żart)
  • Co jest lepsze dla nazwy użytkownika? powinienem użyć int, bigint lub varchar? Wyjaśnij. Niektórzy z moich znajomych twierdzą, że jeśli użyjemy int, bigint lub innego numerycznego typu danych, to będzie lepiej (facebook to robi). Podobnie jak u = 123400023 odnosi się do użytkownika 123400023, a następnie user = thenameof użytkownika. Ponieważ liczby zabierają mniej czasu.
  • Co jest lepsze dla numerów telefonów? Posty (jak w blogach lub ogłoszeniach)? A może daty (do tego używam datetime)? może niektórzy dokonali badań, którymi chcieliby się podzielić.
  • Cena produktu (używam miejsc dziesiętnych (11,2), nie wiem o was)?
  • Lub cokolwiek innego, co masz na myśli, na przykład: "Używam seryjnego typu danych dla blablabla".

Dlaczego konkretnie wspominam o innodbie?

Jeśli nie korzystając z tabeli InnoDB typów (patrz rozdział 11, "Advanced MySQL", aby uzyskać więcej informacji), CHAR kolumny są szybciej dostępne niż VARCHAR.

Inno db ma pewne różnice, których nie znam. Przeczytałem to od here.

+0

dzięki colithium do poprawki. Nie wiem jak poradzić sobie z linkami haha. –

+0

dodano znacznik mysql. –

Odpowiedz

15

Krótkie podsumowanie:

(tylko moje opinie)

  1. na adres e-mail - VARCHAR(255)
  2. o nazwę użytkownika - VARCHAR(100) lub VARCHAR(255)
  3. dla id_username - wykorzystać INT (chyba planujesz ponad 2 miliardy użytkowników w twoim systemie)
  4. numery telefonów - INT lub VARCHAR a może CHAR (zależy czy chcesz zachować formatowanie)
  5. posty - TEXT
  6. daktyle - DATE lub DATETIME (na pewno to razy na takie rzeczy jak wiadomości lub e-maile)
  7. pieniędzy - DECIMAL(11,2)
  8. misc - patrz niżej

miarę używając InnoDB ponieważ VARCHAR powinien być szybszy, nie martwiłbym się o to ani o prędkość w ogóle. Użyj InnoDB, ponieważ musisz wykonać transakcje i/lub chcesz użyć ograniczeń klucza obcego (FK) dla integralności danych. Ponadto InnoDB używa blokowania na poziomie wiersza, podczas gdy MyISAM używa tylko blokowania na poziomie tabeli. Dlatego InnoDB może obsługiwać wyższe poziomy współbieżności lepiej niż MyISAM.Użyj MyISAM do używania pełnotekstowych indeksów i nieco mniej narzutów.

Co ważniejsze dla prędkości niż typ silnika: umieść indeksy na kolumnach, które trzeba szybko przeszukać. Zawsze umieszczaj indeksy na twoich kolumnach ID/PK, takich jak id_username, o których wspomniałem.

Więcej szczegółów:

Oto kilka pytań na temat typów danych MySQL i projektowania baz danych (ostrzeżenia, ponad prosiłeś):

i kilka pytań na kiedy używać silnik InnoDB:

wystarczy użyć tinyint prawie wszystko (poważnie).

Edycja - Jak przechowywać „posty:”

Poniżej znajdują się linki o więcej szczegółów, ale tutaj jest krótka wersja. Do przechowywania "postów" potrzebujesz miejsca na długi ciąg tekstowy. CHAR maksymalna długość to 255, więc nie jest to opcja, i oczywiście CHAR będzie marnować nieużywane znaki kontra VARCHAR, który jest zmiennej długości CHAR.

Przed MySQL 5.0.3, VARCHAR maksymalna długość to 255, więc pozostanie Ci TEXT. Jednak w nowszych wersjach MySQL można użyć VARCHAR lub TEXT. Wybór sprowadza się do preferencji, ale istnieje kilka różnic. VARCHAR i TEXT maksymalna długość wynosi teraz 65 535, ale możesz ustawić własną wartość maksymalną na VARCHAR. Załóżmy, że uważasz, że Twoje posty będą miały tylko 2000 maks., Możesz ustawić VARCHAR(2000). Jeśli przekroczysz limit, możesz później ustawić tabelę i ustawić ją na VARCHAR(3000). Z drugiej strony, TEXT faktycznie przechowuje swoje dane w postaci BLOB (1). Słyszałem, że mogą występować różnice w wydajności między VARCHAR i TEXT, ale nie widziałem żadnego dowodu, więc możesz chcieć przyjrzeć się temu więcej, ale zawsze możesz zmienić ten drobny szczegół w przyszłości.

Co ważniejsze, wyszukiwanie tej kolumny "post" przy użyciu indeksu pełnotekstowego zamiast LIKE byłoby znacznie szybsze (2). Jednakże, musisz użyć silnika MyISAM, aby użyć pełnotekstowego indeksu, ponieważ InnoDB go nie obsługuje. W bazie danych MySQL możesz mieć heterogeniczną mieszankę silników dla każdego stołu, więc po prostu musisz ustawić tabelę "posty" za pomocą MyISAM. Jeśli jednak bezwzględnie potrzebujesz "postów" do korzystania z InnoDB (w przypadku transakcji), skonfiguruj wyzwalacz do aktualizacji kopii MyISAM twojego "postu" tabeli i użyj kopii MyISAM dla wszystkich wyszukiwań pełnotekstowych.

Zobacz kilka przydatnych cytatów.

(3) „Wartości w kolumnach VARCHAR są zmiennej długości struny. Długość może być określona jako wartość od 0 do 255 przed MySQL 5.0.3 i od 0 do 65 535 w wersji 5.0.3 i nowszych.

Przed MySQL 5.0.3, jeśli potrzebujesz danych typ, dla których obowiązuje spływu nie usunięty, należy rozważyć użycie BLOB lub tekst typu.

Po zapisaniu wartości CHAR są one prawostronnie wypełnione spacjami do określonej długości . Gdy wartości CHAR są usunięte, końcowe spacje są usuwane .

Przed MySQL 5.0.3, końcowe spacje są usuwane z wartości, gdy są zapisane w kolumnie VARCHAR; to oznacza, że ​​obowiązuje również są nieobecne z pobranych wartości „

Wreszcie, oto wielki post o zaletach i wadach VARCHAR kontra tekst mówi się również do kwestii wydajności..

+0

co z postem? 1 for = "thelongpost"? , 2 = "the2ndlongpost" :). –

+1

Przepraszam Adam, myślałem, że dodałem kolejny link, który odpowiedział na twoje pytanie. Cóż, zapoznaj się z moją edycją dotyczącą przechowywania "wpisów". – JohnB

+0

Strzelaj, zapomniałem wspomnieć, że InnoDB nie obsługuje indeksu pełnotekstowego. Musisz użyć MyISAM. Proszę ponownie przeczytać moją sekcję na ten temat. – JohnB

3

Istnieje wiele kąty zbliżyć swoje pytanie.

Z projektu POV zawsze najlepiej jest wybrać typ danych, który wyraża ilość, którą chce się najlepiej modelować. Oznacza to, że domena danych i rozmiar danych są odpowiednie, aby nielegalne dane nie mogły być przechowywane w bazie danych.Ale to nie jest miejsce, w którym MySQL jest silny, a zwłaszcza nie z domyślnym trybem sql_ (http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html). Jeśli to działa, spróbuj TRADYCYJnego sql_mode, który jest skrótem dla wielu pożądanych flag.

Z POV przedstawienia, pytanie jest zupełnie inne. Na przykład, dotyczące przechowywania treści wiadomości e-mail, możesz przeczytać http://www.mysqlperformanceblog.com/2010/02/09/blob-storage-in-innodb/ i pomyśleć o tym.

Usuwanie zwolnień i posiadanie krótkich kluczy może być dużą wygraną. Na przykład w projekcie, który widziałem, tabela dziennika przechowywała informacje o użytkowniku http. Po prostu zastąpienie każdego ciągu agenta użytkownika w tabeli dziennika identyfikatorem liczbowym ciągu agenta użytkownika w tabeli odnośników, rozmiar zestawu danych został znacznie (ponad 60%) zredukowany. Później analizując agent użytkownika, a następnie przechowując kilka identyfikatorów (system operacyjny, typ przeglądarki, indeks wersji), rozmiar zestawu danych został zmniejszony do 1% pierwotnego rozmiaru.

Wreszcie istnieje szereg reguł, które mogą pomóc wykryć błędy w projekcie schematu.

Na przykład wszystko, co ma id w nazwie i nie jest typem całkowitym bez znaku, jest prawdopodobnie błędem (zwłaszcza w kontekście innodb).

Na przykład wszystko, co ma cenę lub koszt w nazwie i nie jest niepodpisane, jest potencjalnym źródłem oszustwa (oszust tworzy artykuł z ceną ujemną i kupuje go).

Na przykład wszystko, co działa na danych pieniężnych i nie używa typu danych DECIMAL o odpowiednim rozmiarze, prawdopodobnie wykonuje pomyłkę matematyczną (DECIMAL wykonuje BCD, dziesiętna matematyka z poprawną precyzją i zaokrągleń, PODWÓJNE i FLOAT nie).

1

SQLyog ma Oblicz optymalną jednostkę danych: funkcja, która pomaga w znalezieniu optymalnego typu danych na podstawie rekordów wstawionych do tabeli. wykorzystuje Procedura

SELECT * FROM table_name` Analyse (1, 10);

kwerendy, aby dowiedzieć się optymalną dataType