Расчет объема данных
Что такое объем данных
Объем данных – это количество информации, хранимой в цифровом виде, измеряемое в байтах и их производных (килобайтах, мегабайтах, гигабайтах, терабайтах). В отличие от статистического понятия «объем выборки» (количество наблюдений), расчет объема данных в IT означает оценку места на диске или в памяти, которое займет набор значений.
Зачем нужен такой расчет:
- Проектирование хранилища – перед развертыванием БД или файловой системы
- Планирование ресурсов – оценка стоимости облачного хранилища
- Оптимизация запросов – понимание, сколько данных помещается в оперативную памяти
- Собеседования – задачи на оценку масштабов систем
Единицы измерения
Система единиц измерения объема данных использует степени числа 1024 (для двоичной системы) и 1000 (для десятичной). В документации производителей накопителей и провайдеров обычно используется десятичная система (1 ГБ = 1000³ байт), тогда как операционные системы часто показывают двоичную (1 ГБ = 1024³ байт, называемый гибибайтом).
| Обозначение | Название | Байт (десятичная) | Байт (двоичная) |
|---|---|---|---|
| Б (B) | Байт | 1 | 1 |
| КБ (KB) | Килобайт | 1 000 | 1 024 |
| МБ (MB) | Мегабайт | 1 000 000 | 1 048 576 |
| ГБ (GB) | Гигабайт | 1 000 000 000 | 1 073 741 824 |
| ТБ (TB) | Терабайт | 10¹² | 2⁴⁰ |
Для упрощения расчетов в быстрой оценке используют степени 1000. При точных вычислениях – степени 1024.
Формулы расчета объема данных
Строковые данные (текст, VARCHAR)
Формула расчета для строки:
объем*строки = количество*символов × байт*на*символ
UTF-8 кодирует символы переменным количеством байт:
- ASCII (латиница, цифры, базовые знаки) – 1 байт
- Кириллица, латиница с диакритикой – 2 байта
- Символы CJK (китайский, японский) – 3 байта
- Emoji и редкие символы – 4 байта
Для консервативной оценки используйте 4 байта на символ (максимум UTF-8). Для текста на русском языке – 2 байта.
Пример: поле «ФИО клиента», средняя длина 30 символов, русский текст:
30 символов × 2 байта = 60 байт на запись
Числовые типы данных
Размер числа зависит от его диапазона:
| Тип | Байт | Максимальное значение |
|---|---|---|
| TINYINT | 1 | 255 |
| SMALLINT | 2 | 65 535 |
| INT (INTEGER) | 4 | 4 294 967 295 |
| BIGINT | 8 | 18 446 744 073 709 551 615 |
| FLOAT | 4 | ~3,4 × 10³⁸ |
| DOUBLE | 8 | ~1,8 × 10³⁰⁸ |
| DECIMAL(p,s) | ~p/2 | зависит от точности |
Формула определения необходимого размера:
минимальный*размер = ceil(log₂(максимальное*значение + 1) / 8)
Пример: поле «возраст клиента», максимальное значение 150:
минимальный_размер = ceil(log₂(151) / 8) = ceil(7,23 / 8) = 1 байт
Достаточно TINYINT (1 байт).
Даты и время
| Тип | Размер (байт) | Диапазон |
|---|---|---|
| DATE | 3 | 1000-01-01 → 9999-12-31 |
| TIME | 3–4 | −838:59:59 → +838:59:59 |
| DATETIME | 5–8 | 1000-01-01 00:00:00 → 9999-12-31 23:59:59 |
| TIMESTAMP | 4 | 1970-01-01 00:00:00 UTC → 2038-01-19 |
| YEAR | 1 | 1901 → 2155 |
В MySQL DATETIME занимает 5 байт без микросекунд, 8 байт с микросекундами.
Булевы значения
Булевы значения в большинстве СУБД хранятся как 1-байтовое целое число (0 или 1). В некоторых системах (например, PostgreSQL с типом boolean) используется 1 байт с тремя состояниями: TRUE, FALSE, NULL.
Перечисления (ENUM)
Перечисления обычно занимают 1–2 байта в зависимости от количества вариантов:
- ≤ 255 значений – 1 байт
- ≤ 65 535 значений – 2 байта
Практические примеры расчета
Пример 1: Таблица клиентов
База данных интернет-магазина, таблица customers на 100 000 записей:
| Поле | Тип | Длина/значения | Размер (байт) |
|---|---|---|---|
| id | BIGINT | автоинкремент | 8 |
| name | VARCHAR | 50 символов (UTF-8, кириллица) | 100 |
| VARCHAR | 100 символов (ASCII) | 100 | |
| phone | VARCHAR | 20 символов (ASCII) | 20 |
| birth_date | DATE | – | 3 |
| created_at | DATETIME | – | 5 |
| is_active | TINYINT | 0/1 | 1 |
| Итого на строку | 237 |
Общий объем данных без индексов:
237 байт × 100 000 = 23 700 000 байт ≈ 23 МБ
С учетом накладных расходов СУБД (≈30%):
23 МБ × 1,3 ≈ 30 МБ
Пример 2: Логи посещений
Таблица веб-аналитики, 1 000 000 записей в день:
| Поле | Тип | Размер (байт) |
|---|---|---|
| id | BIGINT | 8 |
| user_id | BIGINT | 8 |
| page_url | VARCHAR(200) | 400 |
| ip_address | VARCHAR(45) | 45 |
| user_agent | VARCHAR(255) | 255 |
| timestamp | TIMESTAMP | 4 |
| Итого | 720 |
За день:
720 байт × 1 000 000 = 720 000 000 байт ≈ 720 МБ
За месяц (30 дней):
720 МБ × 30 ≈ 21,6 ГБ
Пример 3: Расчет объема JSON-данных
Документ профиля пользователя в NoSQL (MongoDB):
{
"user_id": "650a2...",
"name": "Иван Петров",
"email": "ivan@example.com",
"preferences": {
"theme": "dark",
"notifications": true,
"language": "ru"
},
"orders_count": 42,
"last_login": "2024-01-15T10:30:00Z"
}
Расчет объема строки (json):
Символы (с пробелами): ~200
UTF-8 (русский + базовые): ~1,5 байта/символ в среднем
Итого: ~300 байт на документ
При 1 миллионе пользователей:
300 байт × 1 000 000 ≈ 300 МБ (без индексов)
Дополнительные факторы
Индексы
Индексы значительно увеличивают объем хранимых данных. Простой индекс на одно поле обычно занимает 30–50% от размера самого поля на каждую строку. Составной индекс пропорционален сумме размеров полей.
Правило: полный индекс на все поля таблицы удваивает её размер.
Репликация
При использовании репликации (Master-Slave, MongoDB Replica Set) объем умножается на количество копий:
- 2 реплики – ×2
- 3 реплики – ×3
- Кворум 3 из 5 – ×3
Сжатие
Коэффициент сжатия зависит от типа данных:
- Текстовые данные: 0,3–0,5 (экономия 50–70%)
- Числовые данные: 0,8–0,9 (экономия 10–20%)
- Индексы: 0,6–0,8 (экономия 20–40%)
- JSON/Logs: 0,2–0,4 (экономия 60–80%)
Резервные копии
Резервные копии обычно занимают:
- Без сжатия: размер базы данных × 1
- Со сжатием (gzip): размер БД × 0,3–0,5
- Инкрементные: зависят от частоты изменений
Быстрая оценка: множители для запоминания
Для грубой оценки объема данных используйте следующие коэффициенты:
| Тип данных | Оценка на запись |
|---|---|
| Строка текста (короткая) | 10–50 байт |
| Строка текста (длинная) | 100–500 байт |
| Числовое поле | 4–8 байт |
| Дата/время | 4–8 байт |
| Булево поле | 1 байт |
| Средняя строка БД | 50–200 байт |
Формула быстрой оценки таблицы:
объем_МБ = количество_строк × средний_размер_строки_байт / 1 000 000
Затем добавьте:
- Индексы: ×1,5–2,0
- Репликация: ×количество_реплик
- Сжатие текста: ×0,5
Калькулятор объема данных
Для точного расчета используйте калькулятор – введите количество записей и типы полей, получите оценку объема с учетом индексов и репликации.
Справочная таблица размеров типов данных
| Тип | Размер | Описание |
|---|---|---|
| TINYINT | 1 | 0–255 |
| SMALLINT | 2 | 0–65 535 |
| INT | 4 | 0–4,3 млрд |
| BIGINT | 8 | До 18,4 квинтиллионов |
| FLOAT | 4 | Число с плавающей точкой |
| DOUBLE | 8 | Двойная точность |
| DATE | 3 | Дата |
| TIMESTAMP | 4 | Дата и время (до 2038) |
| DATETIME | 5 | Дата и время |
| BOOLEAN | 1 | TRUE/FALSE |
| VARCHAR(n) | – | n символов × 1–4 байта |
Зная объем данных, вы сможете точнее планировать инфраструктуру, выбирать тарифы облачных провайдеров и оптимизировать производительность системы.