Тюнинг MySQL-сервера: сжатие таблиц InnoDB

Jul 8, 2015 22:21 · 293 words · 2 minute read mysql innodb

В больших проектах со временем размер баз данных разрастается до множества гигабайт (терабайт), поэтому всегда остается открытым вопрос как с этим бороться.

Известно несколько вариантов решения данной проблемы — уменьшение объема данных (грубо говоря, удаление старых записей), разделение одной базы данных на несколько, шардирование, приобретение нового оборудования (новых серверов или жестких дисков большего объема).

В большинстве случаев, уменьшение объема данных невозможно, так как база данных увеличивается за счет активного использования. Более того, если движок базы данных InnoDB, то недостаточно просто удалить записи из таблиц. Иногда архитектура проекта не позволяет разделить одну базу данных на несколько, а шардирование хорошо реализуется только при условии отсутствия (или минимального количества) связей между таблицами. Покупка нового оборудования стоит денег и требует времени на его установку и настройку.

Разработчики проекта Basecamp для своей базы данных использовали сжатие таблиц InnoDB (InnoDB compression) — давайте разберемся с таким подходом!

Прежде чем использовать их опыт, необходимо знать следующее:

  • сжатие таблиц InnoDB лучше применять на таблицах с данными типа text/BLOB;
  • при работе со сжатыми таблицами увеличивается нагрузка на процессор (за счет компрессии/декомпрессии таблиц).

Что нужно для сжатия таблиц InnoDB:

  • тип движка базы данных (storage engine) должен быть InnoDB;
show variables like 'storage_engine'\G;
*************************** 1. row ***************************
Variable_name: storage_engine
        Value: InnoDB
1 row in set (0.00 sec)
  • параметр innodb_file_per_table должен быть включен (как включить данную опцию читайте в этой статье);
show variables like 'innodb_file_per_table'\G;
*************************** 1. row ***************************
Variable_name: innodb_file_per_table
        Value: ON
1 row in set (0.00 sec)
show variables like 'innodb_file_format'\G;
*************************** 1. row ***************************
Variable_name: innodb_file_format
        Value: Barracuda
1 row in set (0.00 sec)
  • помните, что лучше сжимаются таблицы с текстовыми полями.

Как сжать таблицу:

  • подключаемся к MySQL-серверу:
mysql -u<имя_пользователя> -p<пароль>
  • выбираем базу данных:
use <имя_базы_данных>;
  • выполняем запрос:
ALTER TABLE <имя_таблицы> ROW_FORMAT=COMPRESSED;
tweet Share