Для чего нужен тип данных SMALLINT в базах данных?

Ответ

SMALLINT — это целочисленный тип данных SQL, который используется для оптимизации хранения, когда диапазон возможных значений заранее известен и ограничен.

Ключевые характеристики:

  • Размер: Обычно занимает 2 байта (16 бит).
  • Диапазон значений:
    • SIGNED (со знаком): от -32 768 до 32 767
    • UNSIGNED (без знака): от 0 до 65 535

Практическое применение:

  • Статусы и коды: Коды HTTP-статусов, внутренние статусы заказа (1-создан, 2-оплачен, 3-доставлен).
  • Небольшие числовые атрибуты: Возраст человека, рейтинг по 10-балльной шкале, количество товаров в небольшой корзине.
  • Флаги и перечисления с числовым представлением.

Пример:

CREATE TABLE orders (
    id INT PRIMARY KEY,
    -- Статус заказа: 1-новый, 2-в обработке, 3-выполнен, 4-отменен
    status_code SMALLINT UNSIGNED NOT NULL DEFAULT 1,
    -- Приоритет заказа от 1 (низкий) до 5 (критический)
    priority SMALLINT UNSIGNED NOT NULL DEFAULT 3,
    CHECK (priority BETWEEN 1 AND 5)
);

Преимущество: Использование SMALLINT вместо INT (4 байта) экономит место на диске и в оперативной памяти, а также может ускорить обработку запросов, особенно при работе с большими таблицами и индексами.

Ответ 18+ 🔞

Давай разжую про этот ваш SMALLINT, а то некоторые думают, что это такой маленький интеллигент в базе данных.

Представь, что тебе надо хранить не астрономические суммы, а всякую ерунду вроде возраста твоей бабушки или количества бутылок пива, которые ты можешь выпить за вечер (ну, скажем, до 65 штук). Вот для этой кухонной арифметики и придумали SMALLINT. Это как взять здоровенный ящик INT на 4 байта, посмотреть на него и сказать: «Ёпта, да тут же овердохуища места!» — и запихнуть всё в аккуратную коробочку в 2 байта.

Что у него внутри:

  • Места жрёт: Всего 2 байта. Не размазывай сопли.
  • Сколько влезет:
    • Если со знаком (SIGNED) — от -32 768 до 32 767. Хватит, чтобы описать твой возможный счёт в покере после неудачного вечера.
    • Если без знака (UNSIGNED) — от 0 до 65 535. Идеально, чтобы посчитать, сколько раз ты обещал бросить пить.

Где это реально нужно:

  • Всякие статусы: Код ответа сервера (404, 200), этап заказа («1 — создан», «2 — оплачен», «3 — потерян почтой России»).
  • Небольшие цифры: Рейтинг фильма от 1 до 10, количество голов у футболиста за сезон (если только это не Месси в 2012-м).
  • Флаги: Тот самый случай, когда вместо длинных строк типа 'active' или 'banned' пишешь циферки. Экономия, блядь!

Смотри, как это выглядит в деле:

CREATE TABLE orders (
    id INT PRIMARY KEY,
    -- Статус заказа: 1-новый, 2-в обработке, 3-выполнен, 4-отменен
    status_code SMALLINT UNSIGNED NOT NULL DEFAULT 1,
    -- Приоритет заказа от 1 (низкий) до 5 (критический)
    priority SMALLINT UNSIGNED NOT NULL DEFAULT 3,
    CHECK (priority BETWEEN 1 AND 5)
);

А в чём, собственно, прикол? Всё просто, чувак. Если ты будешь хранить количество просмотров котиков (допустим, до 50к) в обычном INT, ты просто будешь тратить в два раза больше места зря. А теперь умножь эту разницу на миллионы строк. База начнёт жрать память и тормозить, как пьяный слон на льду. SMALLINT — это про то, чтобы не быть распиздяем и брать ровно столько, сколько нужно. Экономия места, потенциально более шустрые индексы — красота, да и только. Главное — не пытайся впихнуть в него число жителей Москвы, а то будет тебе хиросима, вротберунчик.