2013-09-26 11 views
7

Czy użycie typu smallint w tabeli mysql zamiast zwykłego int faktycznie poprawia wykorzystanie pamięci? Czy sprzęt nie po prostu przydzieliłby całego 64-bitowego rozmiaru słowa dla wszystkich danych? Jeśli nie przydzieli pełnego słowa, czy nie zauważylibyśmy spadku wydajności spowodowanego analizą wielu drobnych drobnych drobinek lub drobnych drobiazgów z 64-bitowego słowa przydzielonego w pamięci?Czy używanie smallinta w int w mysql faktycznie oszczędza pamięć?

Zasadniczo, czy istnieje jakaś konstrukcja/pamięć/wydajność przy korzystaniu z poniższej tabeli zamiast tej po niej, zakładając, że wiemy, że zakres wartości zapisanych w kolumnie Status nigdy nie przekroczy zakresu max/min smallint? Dowolny wgląd zostanie doceniony:

create table `TestTableWithSmallInt` (
    `ID` bigint(20) NOT NULL AUTO_INCREMENT, 
    `Status` smallint(11) DEFAULT 0, 
    PRIMARY KEY (`ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

create table `TestTableWithInt` (
    `ID` bigint(20) NOT NULL AUTO_INCREMENT, 
    `Status` int(11) DEFAULT 0, 
    PRIMARY KEY (`ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

Odpowiedz

7

Teoretycznie zapiszesz dwa bajty w wierszu, a SMALLINT to 16-bitowa liczba całkowita ze znakiem w porównaniu z INT, która jest podpisana w trybie 32-bitowym. The various types have varying storage requirements.

Zwykle oszczędności między INT i SMALLINT powodują tak niewielki wzrost wydajności, że trudno będzie je zmierzyć, zwłaszcza jeśli w ten sposób przycina się niewielką liczbę pól.

Przeciwnie, użyjesz tylko BIGINT, gdy można sobie wyobrazić, że możesz wyczerpać przestrzeń numerową pola oznaczonego flagą AUTO_INCREMENT.

Powinieneś zadeklarować je w swoich nagich typach, bez żadnej długości, aby uzyskać jak najlepsze dopasowanie. INT jest lepszym rozwiązaniem niż INT(11), a SMALLINT(11) wprowadza w błąd, ponieważ niemożliwe jest uzyskanie takiej dokładności z 16-bitowej wartości.

+0

Może to raczej pytanie o sprzęt? Moje rozumienie architektury 64-bitowej polega na tym, że nawet najmniejsza możliwa wartość nadal będzie zajmować 64-bitowy rozmiar słowa. Jeśli tak, czy smallint nadal nie użyje tej samej 64-bitowej porcji pamięci jako int? Tak więc, zadeklarowanie pola jako smallint mogłoby jedynie narzucić maksymalną wartość na polu, bez faktycznego zapisywania jakiejkolwiek pamięci? Dzięki za poradę dotyczącą deklarowania nagich typów przy okazji :) – encrest

+1

Tak nie jest. Być może myślisz o problemach z wyrównaniem, ale 16-bitowe wartości są [wyrównane do 4-bajtowych granic] (http://software.intel.com/en-us/articles/data-alignment-when-migrating-to- 64-bit-intel-architecture) nie 8. Naprawdę nie przejmowałbym się tym, chyba że można zmierzyć ślad pamięciowy MySQL w znaczący sposób i nigdy nie musiałam zajmować się tym poziomem szczegółowości. Komputery mają gigabajty pamięci i istnieją optymalizacje, które umożliwiają mocniejsze pakowanie danych, rzadko jest to problemem. – tadman

1

Odgarnianie danych z kompaktowych bloków pamięci jest szybsze. Dopiero gdy w grę wchodzi język programowania, następuje konwersja.