Decimal VS Int в MySQL?

есть ли разница в производительности между decimal(10,0) unsigned тип и int(10) unsigned тип?

4 ответов


это может зависеть от версии MySQL вы используете. См.здесь.

до MySQL 5.0.3 десятичный тип сохранялся как строка и обычно был бы медленнее. Однако, поскольку MySQL 5.0.3 десятичный тип хранится в двоичном формате, поэтому с размером вашего десятичного знака выше, может быть не так много разницы в производительности.

основной проблемой производительности было бы количество пространства, занятого различными типами (с десятичным числом замедлившийся.) С MySQL 5.0.3+ это кажется менее проблемой, однако, если вы будете выполнять числовые вычисления по значениям как часть запроса, может быть некоторая разница в производительности. Это может стоить тестирования, поскольку в документации нет указаний, которые я могу видеть.

Edit: Что касается int(10) unsigned, Я принял это за чистую монету, как просто 4 байт int. Однако это имеет максимальное значение 4294967295, которое строго не обеспечивает то же самое диапазон чисел как DECIMAL(10,0) unsigned .

как указал @Unreason, вам нужно будет использовать bigint для того чтобы покрыть полный диапасон 10 чисел числа, нажимая размер до 8 байт.

распространенной ошибкой является то, что при указании типов числовых столбцов в MySQL люди часто думают, что число в скобках влияет на размер числа, которое они могут хранить. Это не так. Диапазон чисел основан исключительно на типе столбца и на том, подписан он или нет. Номер в скобки предназначены для отображения результатов и не влияют на значения, хранящиеся в столбце. Это также не повлияет на отображение результатов, если вы не укажете ZEROFILL опция на столбце, а также.


согласно данным mysql для хранения ваш десятичный будет требовать

DECIMAL (10,0): 4 байта для 9 цифр и 1 байт для оставшейся 10-й цифры, поэтому в общей сложности пять байтов (при условии, что мое чтение документации правильное).

INT (10):нужно BIGINT, который составляет 8 байт.

различия в том, что decimal упакован, и некоторые операции с таким типом данных могут быть медленнее, чем с обычными типами INT, которые сопоставляются непосредственно к машине представлены номера.

все же я бы сделал ваши собственные тесты, чтобы подтвердить вышеизложенные рассуждения.

изменить: Я заметил, что я не развивал очевидный момент - предполагая, что вышеуказанная логика звучит, разница в размере требуется на 60% больше места, необходимого для варианта BIGINT.

однако это напрямую не переводится в штрафы из-за того, что данные обычно не записываются байт за байтом. В случае выбора / обновления многих строк вы должен видеть потерю/усиление производительности, но в случае выбора/обновления небольшого количества строк файловая система будет извлекать блоки с диска(ов), которые обычно получают/пишут несколько столбцов в любом случае.
Размер (и скорость) индексов могут быть более непосредственно затронуты. Однако вопрос о том, как упаковка влияет на различные операции, остается открытым.


согласно этому аналогичному вопросу, да, потенциально есть большое представление хит из-за разницы в пути DECIMAL и INT обрабатываются и передаются в CPU при выполнении вычислений.

посмотреть: есть ли хит производительности с использованием десятичных типов данных (MySQL / Postgres)


Я сомневаюсь, что такая разница может быть в производительности, на всех.
Большинство проблем производительности связано с правильным дизайном базы данных и планом индексирования, а также настройкой сервера/оборудования на следующем уровне.