Каковы требования к памяти для десятичного числа (2,1)? - PullRequest
3 голосов
/ 17 декабря 2011

В руководстве MySQL 5.6 сказано , что:

Значения для столбцов DECIMAL (и NUMERIC) представлены в двоичном формате, который упаковывает девять десятичных (основание 10) цифр в четыре байта. Хранение для целой и дробной частей каждого значения определяется отдельно. Каждому кратному из девяти цифр требуется четыре байта, а для цифр « остаток » требуется некоторая доля в четыре байта. Объем памяти, необходимый для избыточных цифр, указан в следующей таблице:

+----------------------------------+
|Leftover Digits | Number of Bytes |
+----------------------------------+
|       0        |        0        |
+----------------------------------+
|       1        |        1        |
+----------------------------------+
|       2        |        1        |
+----------------------------------+
|       3        |        2        |
+----------------------------------+
|       4        |        2        |
+----------------------------------+
|       5        |        3        |
+----------------------------------+
|       6        |        3        |
+----------------------------------+
|       7        |        4        |
+----------------------------------+
|       8        |        4        |
+----------------------------------+

Мой вопрос таков: если цифры меньше девяти на каждой стороне десятичной дроби, будут ли они по-прежнему занимать 4 байта или они будут считаться " остатками "?

1 Ответ

0 голосов
/ 17 декабря 2011

Я провел некоторые измерения, используя таблицу MyISAM, чтобы получить ответ, сравнив размер файла таблицы dec.MYD после добавления нескольких столбцов в шесть строк данных. Вот что я получаю:

Original:
-rw-rw----. 1 mysql mysql   54 Dec 17 18:49 dec.MYD

Add one column of DECIMAL(2,1):
-rw-rw----. 1 mysql mysql   66 Dec 17 18:51 dec.MYD

Further add one column of DECIMAL(4,1):
-rw-rw----. 1 mysql mysql   84 Dec 17 18:51 dec.MYD

Заключение:

DECIMAL(2,1) requires (66-54)/6 = 2 bytes in total
DECIMAL(4,1) requires (84-66)/6 = 3 bytes in total

Обратите внимание, что тестирование не так просто, так как первый столбец, кажется, всегда 7 байтов, независимо от того, DECIMAL(2,1) или INT. Вам нужно добавить больше столбцов, чтобы воспроизвести приведенный выше результат.

...