Jak wybrać optymalny typ danych w bazach MySQL
Twórcy stron WWW zbyt często używają złych typów danych w swoich bazach danych. Mając na uwadze to, że zapytania do bazy zajmują najwięcej czasu w trakcie wykonywania skryptu, konieczne jest, aby baza danych i jej tabele były jak najlepiej zoptymalizowane w celu zapewnienia im jak największej wydajności, zwłaszcza w wysokowydajnych aplikacjach.
Bazę MySQL można najprościej zoptymalizować, wybierając poprawny, najlepszy, a więc najbardziej wydajny typ danych. Ale wielu konstruktorów zarówno baz MySQL, jak i innych ma czasem z tym problem. Ludzie niezajmujący się bazami danych, tacy jak programiści PHP, którzy są zmuszeni do użycia MySQL-a w swoich skryptach, bardzo często mylą się w wyborze typu danych.
Aby Wam pomóc zrozumieć dostępne typy danych i – miejmy nadzieję – używać ich poprawnie, przygotowałem opisy kilku najpopularniejszych – tych, których prawdopodobnie używacie najczęściej.
Ze znakiem czy bez znaku (SIGNED or UNSIGNED)?
Dla tych, którzy nie wiedzą, co oznacza, że liczba jest ze znakiem lub bez znaku, podaję krótkie wytłumaczenie:
„Liczby całkowite ze znakiem to takie, w których jeden bit jest przeznaczony na to, by oznaczyć, czy liczba jest ujemna czy nie. W typach bez znaku ten jeden bit nie jest zarezerwowany i liczba może być tylko dodatnia. Liczba INT ze znakiem (SIGNED) może więc przyjąć wartości pomiędzy -2,147,483,648 a 2,147,483,647, a bez znaku od zera do 4,294,967,295.
Jeśli nie będziesz używał liczb mniejszych od zera, powinieneś użyć typu UNSIGNED. Typ bez znaku również nadaje się bardziej na klucz podstawowy z autoinkrementacją w tabeli, ponieważ pozwala on na wprowadzenie większej liczby wierszy”.
Zbyt duże?
Powinieneś pomyśleć dokładnie przed tworzeniem pól. Jeśli masz tabelę użytkowników w małej witrynie internetowej, a klucz podstawowy ma typ INSIGNED INT, powinieneś zadać sobie pytanie, czy kiedykolwiek uzyskasz 4,294,967,295 użytkowników. Najbardziej prawdopodobną odpowiedzią jest „nie”. Musisz pomyśleć, ilu maksymalnie użytkowników będzie prawdopodobnie na Twojej stronie. Później wybierz prawidłowy typ danych numerycznych, który pokrywa się z Twoimi potrzebami. Stworzyłem tabelkę z typami danych numerycznych oraz ich minimalnymi i maksymalnymi wartościami:
|
Type |
Minimum |
Maximum |
|---|---|---|
| SIGNED TINYINT | -128 | 127 |
| UNSIGNED TINYINT | 0 | 255 |
| SIGNED SMALLINT | -32,768 | 32,767 |
| UNSIGNED SMALLINT | 0 | 65,535 |
| SIGNED MEDIUMINT | -8,388,608 | 8,388,607 |
| UNSIGNED MEDIUMINT | 0 | 16,777,215 |
| SIGNED INT | -2,147,483,648 | 2,147,483,647 |
| UNSIGNED INT | 0 | 4,294,967,295 |
| SIGNED BIGINT | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 |
| UNSIGNED BIGINT | 0 | 18,446,744,073,709,551,615 |
Jaka jest różnica pomiędzy CHAR I VARCHAR?
Te dwa typy różnią się tym, że CHAR ma stałą długość, VARCHAR natomiast zmienną. Oznacza to, że CHAR ma zawsze tę samą wielkość i zajmuje tyle samo bajtów, podczas gdy VARCHAR się zmienia, a ponadto dodaje jeden dodatkowy bajt danych. Kiedy powinniśmy używać CHAR?
Do przechowywania haseł MD5, które mają zawsze 32 znaki (jeśli przechowujemy je w postaci szesnastkowej, lepiej przechowywać je jako 16 bajtów w polu BINARY).
Do przechowywania kodów paskowych o stałej długości.
A kiedy VARCHAR?
Do przechowywania adresów e-mailowych oraz imion i nazwisk ludzi, które różnią się długością.
Będziemy raczej stosowali VARCHAR do danych wprowadzanych przez użytkowników, ponieważ mogą się one różnić długością.
Przechowywanie jako liczby
Kiedy jest to możliwe, powinno się przechowywać dane jako liczby, ponieważ przeszukiwanie i sortowanie ich jest szybsze. Na przykład adres IP może zostać przechowany w formie:
123.123.123.123
dzięki użyciu VARCHAR(15). Jeśli zostanie on przetłumaczony na adres sieciowy protokołu IPv4 (dzięki użyciu np. funkcji ip2long() w PHP), może zostać zachowany jako:
2071690107
w polu SIGNED INT.
Wybór poprawnego typu daty/czasu
W MySQL-u istnieje pięć różnych typów daty i czasu:
- DATE,
- TIME,
- TIMESTAMP,
- DATETIME,
- YEAR.
DATE podaje tylko datę z dokładnością do jednego dnia. TIME reprezentuje czas (ale nie datę) wraz z sekundami. DATETIME to data i czas z dokładnością do pojedynczych sekund. TIMESTAMP to liczba sekund od EPOCH, a YEAR to po prostu rok.
YEAR wymaga jednego bajta, jest więc najlepszy do zapisu samego roku.
DATE i TIME to najmniejsze typy daty/czasu, które wymagają jedynie 3 bajtów.
TIMESTAMP wymaga 4 bajtów.
DATETIME wymaga 8 bajtów.
W prawie każdym przypadku najlepiej jest używać TIMESTAMP, który podaje datę i czas z dokładnością do sekundy.
źródło: http://making-the-web.com/2008/04/27/choosing-optimal-mysql-data-types/
Komentarze
Aby dodać komentarz, musisz podać swój nick, treść komentarza oraz poprawnie przepisać oba słowa z obrazka
(słowa muszą być rozdzielone spacją).
W treści komentarza można używać języka formatowania BBcode.
Popularne
Nazwa padła ofiarą szantażystów, inni polscy hosterzy też zagrożeni?
22
Darmowy Internet od Aero2. Jak go zdobyć i jakie są prawdziwe koszta? Instrukcja krok po kroku
11
Programowanie w środowisku Android – wprowadzenie do projektowania aplikacji dla urządzeń mobilnych
17
Premiera Diablo 3 wzbudziła dyskusję na temat gier, które zawsze chcą być online
19
Nowy problem z Windows 8: bootuje się za szybko
10
Amerykańscy rodzice straszeni „e-narkotykami” dostępnymi w Sieci
21
Anonymous upubliczniają 1,7 GB danych wykradzionych Departamentowi Sprawiedliwości USA
12
Blueseed: libertariańska sztuczna wyspa przyciągnęła już ponad sto startupów z całego świata
8
Rewolucja w Firefoksie, nowa łatka czterokrotnie ograniczyła zużycie pamięci
20
Darmowy Internet od Aero2. Jak go zdobyć i jakie są prawdziwe koszta? Instrukcja krok po kroku
11
CVDazzle: makijaż jest w stanie pokonać automatyczne systemy ulicznego monitoringu
3
Programowanie w środowisku Android – wprowadzenie do projektowania aplikacji dla urządzeń mobilnych
17
Ubuntu 12.04 LTS już dostępny: stabilna dystrybucja na następne pięć lat?
28
Zostań webmasterem polskiego rządu, zarobisz na komfortowe życie dla siebie i swojej rodziny
33
Społeczność
piotrek____ @asdfgh - yup, też tak sądzę.
Tak jak wtedy ten przeciek o żołnierzu...
gonzales Javowcy pozdrawiają dotnetowców xD
kaziks Galaxy S II - u mnie po aktualizacji Firefox działa strasznie zacina się...
Doniek Szkoda że strona z demo nie działa - non stop się przeładowuje
bartez Niech zaczną jeszcze bardziej ograniczać programistów, to zdziwią się ilu...
Dave Smith Jestem Pastor Dave Smith prywatny pożyczkodawca pieniądze, z czego ponad...
marcusm Fajna reklama produktu za 500 zł
- Najdmen.pl: Konta www z wyłączonym licznikiem transferu od IONIC.pl (1)
- 2BE.PL: [Oferta] Promocja jak złoto w 2BE.PL (1)
- gardius: Dobra hurtownia sportowa (1)
- gardius: Tanie książki gdzie warto kupować? (1)
- Najdmen.pl: PROMOCJA, 500 DOMEN .EU ZA 1 PLN NETTO ! (1)
- VMLine: [Oferta] Serwery VPS Xen-HVM/OpenVZ z darmową administracją (2)
- Marek: Generowanie PDFa (2)
Polecane książki
Praca
Czytaj Webhosting
Chcesz być na bieżąco z naszymi informacjami? Zapisz się na Newsletter.
Zarejestruj domenę
Sprawdź dostępność swojej domeny:
| .pl: | 0 zł | .com: | 19.90 zł | |
|---|---|---|---|---|
| .com.pl: | 0 zł | .eu: | 19.90 zł |









#1 jacek 2008-07-07 11:39:51 0
None
#2 zyczliwy 2008-07-07 11:39:51 0
None
#3 dAREuS 2008-07-07 11:39:51 0
None
#4 mario 2008-07-07 11:39:51 0
None
#5 ktosik 2008-07-07 11:39:51 0
None
#6 Blaze® 2008-08-04 23:54:12 0
None
#7 Admin 2009-12-02 23:16:21 0
IP: 89.72.58.[...] Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
#8 d3uter 2011-02-23 12:12:37 0
IP: 89.79.99.[...] Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13