TINYINT против ENUM (0, 1) для логических значений в MySQL - PullRequest
26 голосов
/ 23 августа 2010

Какой из них лучше, Tinyint со значениями 0 и 1 или ENUM 0,1 в таблицах MyISAM и MySQL 5.1?

Ответы [ 5 ]

25 голосов
/ 23 августа 2010

Вы можете использовать BIT(1), как указано в mysql 5.1 reference . я не буду рекомендовать enum или tinyint(1) для bit(1) требуется только 1 бит для хранения логического значения, а для tinyint(1) требуется 8 бит.

4 голосов
/ 19 октября 2011

Мои исследования показывают, что BIT (1) является синонимом TINYINT (1) для версий MySQL до 5.0.3.

Версии MySQL после 5.0.3 изменяют работу типа данных BIT. Он больше не является синонимом TINYINT и является единственным типом данных, который позволяет хранить что-либо менее чем в одном байте.

Этот тип данных может быть предпочтительнее, чем использование TINYINT или ENUM. Я планирую провести тестирование, чтобы увидеть, какое из них является самым быстрым и использовать пространство из трех в моем блоге. Внизу есть ссылка, если вы хотите увидеть размер и скорость результатов. Испытательный стенд: жесткая коробка Pentium III потребительского уровня, работающая на OpenBSD и MySQL. (С более медленным устройством разработки БД вы действительно можете почувствовать последствия плохого кода. Кроме того, различия между тестовыми запросами более заметны. В качестве альтернативы, попробуйте использовать виртуальную машину с едва выделенными ресурсами.)

Официальная документация MySQL.

Барон Шварц говорит об этом.

http://www.xaprb.com/blog/2006/04/11/bit-values-in-mysql/

1 голос
/ 18 апреля 2013

Enum, в некотором смысле, дает «подсказку» для разработчиков или программистов.Но обычно лучше обращаться с этим программно.Так что, будь то ENUM (0,1), BIT (1) и TINYINT (1), использующие все 1 байт, в большинстве случаев было бы лучше обрабатывать их на стороне клиента, чем отправлять 2 в бит (1)или enum (0,1) к серверу, и тогда сервер вернет ошибку, которую вам придется обработать в любом случае - использует больше ресурсов (сеть + серверный процессор + клиентский процессор x 2)

0 обычно означает false, 1 правда.

1 голос
/ 23 августа 2010

Я бы предположил, что ENUM предпочтительнее, потому что он ясно дает понять, что ожидается; если это ухудшит производительность каким-либо измеримым образом, я был бы очень удивлен. Чтобы сделать tinyint для этой работы, потребуется CHECK ограничение на столбец; ни один из механизмов хранения MySQL в настоящее время не поддерживает это.

0 голосов
/ 11 июля 2018

Для достижения наилучших требований к производительности и пространству вы должны собрать свои логические значения и сохранить их в том же TINYINT.Например.Сохраните до 8 логических значений в TINYINT.16 логических значений в SMALLINT и т. Д. И BIT (1), и ENUM используют как минимум 1 байт BIT(M) - approximately (M+7)/8 bytes, см .: https://dev.mysql.com/doc/refman/8.0/en/storage-requirements.html. Так что, если вы сохраняете 1 логическое значение, я бы использовал TINYINT, поскольку он имеет те же издержки, что иBIT и ENUM, но дает вам возможность сохранить еще 7 логических значений позже, если вам нужно.

...