Сжатие таблиц в MySQL InnoDB: экономия места на SSD/NVMe (Page Compression)
- Критическое исчерпание дорогостоящего дискового пространства на NVMe-массивах под базы данных.
- Огромные объемы архивных или редко изменяемых таблиц с историческими данными (логи, транзакции).
- Высокая стоимость расширения дисковых квот в облачных провайдерах (AWS EBS, GCP PD).
1. Метод 1: Прозрачное сжатие страниц (Transparent Page Compression - Рекомендуется)
Использует механизм разреженных файлов файловой системы (Punch Hole) на Linux (ext4 / XFS):
# Создание таблицы со сжатием LZ4 или ZLIB
CREATE TABLE app_events (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
event_data JSON,
created_at TIMESTAMP
) ENGINE=InnoDB COMPRESSION="lz4";Включение сжатия для существующей таблицы:
ALTER TABLE app_events COMPRESSION="lz4";
OPTIMIZE TABLE app_events;2. Метод 2: Классическое табличное сжатие (ROW_FORMAT=COMPRESSED)
Добавьте параметры в /etc/mysql/my.cnf:
[mysqld]
innodb_file_per_table = 1
innodb_cmp_per_index_enabled = ONСоздание сжатой таблицы с указанием размера страницы:
CREATE TABLE historical_logs (
id INT PRIMARY KEY,
message TEXT
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;3. Мониторинг эффективности сжатия
# Проверка реального дискового размера на файловой системе
ls -lhs /var/lib/mysql/production_db/app_events.ibd
# Проверка статистики сжатия в MySQL
SELECT * FROM information_schema.INNODB_CMP; Частые вопросы (FAQ)
В чем преимущество Page Compression (LZ4) над ROW_FORMAT=COMPRESSED?
Transparent Page Compression не тратит память на хранение сжатых и несжатых копий страниц в Buffer Pool одновременно, тем самым устраняя двойной оверхед по оперативной памяти.
Какое сжатие эффективнее: LZ4 или ZLIB?
LZ4 обеспечивает минимальную нагрузку на CPU при средней степени сжатия (40-60%). ZLIB дает более высокий коэффициент сжатия (до 70%), но требует значительно больше процессорных циклов.