MySQL Archive

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 18:06, 23 февраля 2018.
Archive Storage Engine
Создатели: Brian Aker
Выпущена: 2004
Операционная система: Кросс-платфомерная
Платформа: x86, x86-64, SPARC, MIPS architecture
Локализация: C, C++
Тип ПО: Движок БД
Лицензия: GNU General Public License
Веб-сайт mysql.bkbits.com

MySQL Archive это подсистема хранения для MySQL реляционной СУБД. Пользователи могут использовать эту аналитическую подсистему хранения для создания таблицы, которая будет являться только архивом. Данные не могут быть удалены из этой таблицы, только добавлены. Механизм Archive использует стратегию сжатия, основанную на библиотеке zlib, и упаковывает строки, используя битовый заголовок для представления нулей и удаляет все пробелы для полей символьного типа. По завершении строки вставляются в буфер сжатия и сбрасывается на диск явным сбросом таблицы, чтения или закрытия таблицы.

Одним из текущих ограничений архивных таблиц является то, что они не поддерживают никаких индексов, что требует проверки таблицы для любых задач SELECT. Однако архивные таблицы поддерживаются MySQL Query Cache, что может значительно сократить время отклика для запросов в таблице Archive, которые периодически повторяются.[Источник 1] MySQL изучает поддержку индексов для архивных таблиц в предстоящих выпусках.

Подсистема не поддерживает модель ACID. В отличие от движков OLTP, он использует формат "потока" для диска без границ блока. Главная часть сгенерированного архивного файла представляет собой массив байтов, представляющий формат данных и содержимое этого файла. В MySQL 5.1 копия файла FRM MySQL хранится в заголовке каждого файла архива. FRM-файл, представляющий определение таблицы, позволяет восстановить файл архива на сервер MySQL, если файл архива скопирован на сервер.

Несмотря на использование zlib, архивные файлы не совместимы с gzio, основой инструментов gzip. Archive использует свою собственную систему azio, которая является ответвлением gzio.

Archive отличается от другого аналитического движка MySQL MyISAM, будучи механизмом блокировки на уровне строк и сохраняя постоянной версию мгновенного снимка в одном запросе (делая его параллельно доступным с помощью многоверсионности ). Это означает, что Archive не блокирует параллельные объемные вставки. Для объемных вставок он выполняет чередование INSERT, поэтому, в отличие от MyISAM, порядок не гарантируется.

Пользователи могут использовать инструмент archive_reader, чтобы сделать онлайн-снимок таблицы и изменить характеристики архивного файла.

Чтобы создать архивную таблицу, укажите следующую строчку:

create table t1 (
 a int,
 b varchar(32))
ENGINE=ARCHIVE

MySQL Archive Storage Engine был создан и поддерживается Брайаном Акером. Он был представлен в 2004 году вместе с MySQL 4.1.

Особенности[Источник 2]

  • Элемент маркированного списка
  • макс. диск: нет ограничения
  • блокировка записи
  • не работает DELETE, REPLACE, UPDATE, ORDER BY, тип BLOB
  • INSERT буферизируется и «сливается» с большой задержкой
  • очень медленный SELECT
  • нет поддержки индексов

Рекомендации: логирование операций (аудит, статистические данные, счетчики)

Сравнение с другими подсистемами хранения

Будем сравнивать скорость записи данных и занимаемое место. Для примера возьмем лог записи ошибок. Будем генерировать 1000 случайных текстов ошибок и записывать их в логи.

Создадим три таблицы для записи логов:

CREATE TABLE IF NOT EXISTS `log_archive` (
   `date` INT(11) NOT NULL,
   `text` text NOT NULL,
   `type` enum('error','warning','notice') NOT NULL
 ) ENGINE=ARCHIVE DEFAULT CHARSET=utf8;
 
CREATE TABLE IF NOT EXISTS `log_innodb` (
  `date` INT(11) NOT NULL,
  `text` text NOT NULL,
  `type` enum('error','warning','notice') NOT NULL
) ENGINE=INNODB DEFAULT CHARSET=utf8;
 
CREATE TABLE IF NOT EXISTS `log_myisam` (
  `date` INT(11) NOT NULL,
  `text` text NOT NULL,
  `type` enum('error','warning','notice') NOT NULL
) ENGINE=MYISAM DEFAULT CHARSET=utf8;

С помощью следующего теста (PHP) узнаем какой способ записи самый быстрый:

/*
 * Запуск теста для каждого способа хранения логов
 */
function run_test($engine){
 
    // Тексты для генерации различных сообщений
    $texts = array(
         0 => 'Случилась ошибка. Мы ее записываем в лог. Программа дальше не исполняется.',
         1 => 'Произошло предупреждениег! что с этим делать пока не знаем, но запишем.',
         2 => 'Всего лишь небольшое замечание к твоему коду. Здесь ее подробное описание'
    );
    // Типы ошибок
    $types = array(
        0 => 'error',
        1 => 'warning',
        2 => 'notice'
    );
 
    $t = microtime(true); // Текущее время
 
    if($engine != 'file'){
 
        // Работа с БД
        $connect = mysql_connect('localhost', 'root', '');
 
        if (!$connect) {
            die('Could not connect: ' . mysql_error());
        }
 
        mysql_select_db('dbname', $connect);
    }
 
    for($i = 0; $i<1000; $i++){
        $date = time();
 
        $result = rand(0, 2);
        $type = $types[$result];
        $text = $texts[$result];
 
        if($engine != 'file'){
	//Запись в БД
            $query = "INSERT INTO `log_$engine` VALUES($date, '$text', '$type');";
            mysql_query($query, $connect);
        }else{
	//Запись в файл
            file_put_contents( 'errors.log' , "DATE: $date; TYPE: $type;\nTEXT:\n$text\n\n", FILE_APPEND);
        }
 
    }
    if($engine != 'file'){
        mysql_close($connect);
    }
    print "ENGINE : $engine; TIME : " . (microtime(true) - $t) . "<br/>\n";
}
 
error_reporting(E_ALL);
ini_set('display_errors', 1);
 
run_test('file');
run_test('myisam');
run_test('innodb');
run_test('archive');

Таблица с результатами тестов:

Способ хранения Скорость записи 1000 сообщений Скорость записи 10000 сообщений Занимаемое место 10000 сообщений
Текстовый файл 0.0269 0.3189 175 КБ
MySQL/MyISAM 0.1132 2.2111 1.5 МБ
MySQL/InnoDB 54.6091 529.5946 2.5 МБ
MySQL/ARCHIVE 0.1400 2.0363 23.7 КБ

Примечания

  1. The MySQL 5.0 Archive Storage Engine // dev.mysql.com.[2017–2017]. Дата обновления: 02.12.2017. URL: https://web.archive.org/web/20100212100829/http://dev.mysql.com/tech-resources/articles/storage-engine.html (дата обращения: 02.12.2017)
  2. Краткий обзор движков таблиц MySQL // habrahabr.ru.[2017–2017]. Дата обновления: 02.12.2017. URL: https://habrahabr.ru/post/64851/ (дата обращения: 02.12.2017)

Внешние ссылки