Krótkie podsumowanie:
(tylko moje opinie)
- dla adresu e-mail —
VARCHAR(255)
- dla nazwy użytkownika —
VARCHAR(100)
lubVARCHAR(255)
- dla id_username - użyj
INT
(chyba że planujesz ponad 2 miliardy użytkowników w swoim systemie) - numery telefonów —
INT
lubVARCHAR
a możeCHAR
(zależy od tego, czy chcesz przechowywać formatowanie) - posty —
TEXT
- daty —
DATE
lubDATETIME
(zdecydowanie uwzględnij czas na takie rzeczy jak posty lub e-maile) - pieniądze -
DECIMAL(11,2)
- różne - patrz poniżej
Jeśli chodzi o używanie InnoDB, ponieważ VARCHAR
ma być szybsza, nie przejmowałbym się tym, ani ogólnie szybkością. Użyj InnoDB, ponieważ musisz wykonywać transakcje i/lub chcesz użyć ograniczeń klucza obcego (FK) w celu zapewnienia integralności danych. Ponadto InnoDB używa blokowania na poziomie wiersza, podczas gdy MyISAM używa tylko blokowania na poziomie tabeli. Dlatego InnoDB lepiej radzi sobie z wyższymi poziomami współbieżności niż MyISAM. Użyj MyISAM, aby korzystać z indeksów pełnotekstowych i nieco mniej narzutu.
Co ważniejsze dla szybkości niż typ silnika:umieść indeksy w kolumnach, które chcesz szybko przeszukać. Zawsze umieszczaj indeksy w kolumnach ID/PK, takich jak nazwa_użytkownika, o której wspomniałem.
Więcej szczegółów:
Oto kilka pytań dotyczących typów danych MySQL i projektowania baz danych (ostrzeżenie, więcej niż prosiłeś):
I kilka pytań, kiedy używać silnika InnoDB:
Po prostu używam tinyint
za prawie wszystko (poważnie).
Edytuj – Jak przechowywać „posty”:
Poniżej znajduje się kilka linków z dodatkowymi szczegółami, ale oto krótka wersja. Do przechowywania „postów” potrzebujesz miejsca na długi ciąg tekstowy. CHAR
maksymalna długość to 255, więc to nie jest opcja i oczywiście CHAR
zmarnowałby nieużywane znaki w porównaniu z VARCHAR
, który ma zmienną długość CHAR
.
Przed MySQL 5.0.3 VARCHAR
maksymalna długość to 255, więc zostaniesz z TEXT
. Jednak w nowszych wersjach MySQL możesz użyć VARCHAR
lub TEXT
. Wybór sprowadza się do preferencji, ale jest kilka różnic. VARCHAR
i TEXT
maksymalna długość wynosi teraz 65,535, ale możesz ustawić własną wartość maksymalną na VARCHAR
. Powiedzmy, że myślisz, że Twoje posty będą musiały mieć maksymalnie 2000, możesz ustawić VARCHAR(2000)
. Jeśli za każdym razem osiągniesz limit, możesz ALTER
później stół i wrzuć go do VARCHAR(3000)
. Z drugiej strony TEXT
faktycznie przechowuje swoje dane w 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 dokładniej, ale zawsze możesz zmienić ten drobny szczegół w przyszłości.
Co ważniejsze, przeszukiwanie tej kolumny „post” przy użyciu indeksu pełnotekstowego zamiast LIKE
byłoby znacznie szybsze (2). Jednak musisz użyć silnika MyISAM, aby użyć indeksu pełnotekstowego, ponieważ InnoDB go nie obsługuje . W bazie danych MySQL możesz mieć heterogeniczną mieszankę silników dla każdej tabeli, więc wystarczy, że Twoja tabela „posts” będzie używała MyISAM. Jeśli jednak absolutnie potrzebujesz „postów”, aby korzystać z InnoDB (dla transakcji), skonfiguruj wyzwalacz, aby zaktualizować kopię MyISAM twojej tabeli „posts” i użyj kopii MyISAM do wszystkich wyszukiwań pełnotekstowych.
Patrz na dole kilka przydatnych cytatów.
Na koniec, oto świetny post o zaletach i wadach VARCHAR kontra TEXT. Odnosi się to również do problemu z wydajnością: