MySQL предоставляет множество специализированных подсистем хранения. По разным причинам большинство из них несколько устарели для новых версий. Некоторые же по-прежнему доступны на сервере, но требуют специальной активации.
Archive
Подсистема хранения Archive позволяет выполнять только команды INSERT
и SELECT
, к тому же до версии MySQL 5.1 она не поддерживала индексирование. Archive требует значительно меньше операций дискового ввода/вывода, чем MyISAM, поскольку буферизует записываемые данные и сжимает все вставляемые строки с помощью библиотеки zlib
. Кроме того, каждый запрос SELECT
требует полного просмотра таблицы. Таблицы Archive идеальны для ведения журнала и сбора данных, когда анализ чаще всего сводится к просмотру всей таблицы или когда требуется обеспечить быстроту выполнения запросов INSERT
.
Подсистема Archive поддерживает построчную блокировку и специальную буферную систему для вставки с высокой степенью конкурентности. Она обеспечивает согласованное чтение, останавливая выполнение команды SELECT
после извлечения того количества строк, которое было в таблице к началу выполнения запроса. Она также обеспечивает невидимость результатов пакетной вставки до завершения процедуры. Эти особенности эмулируют некоторые виды поведения транзакций и MVCC, но Archive не является транзакционной подсистемой хранения. Она лишь оптимизирована для высокоскоростной вставки и хранения данных в сжатом виде.
Blackhole
В подсистеме Blackhole механизма хранения данных вообще нет. Она игнорирует команды INSERT
, а не хранит их. Однако сервер записывает запросы к таблицам Blackhole в журналы как обычно, поэтому их можно реплицировать на подчиненные серверы или просто сохранить в журнале. Это делает подсистему Blackhole полезной для настройки предполагаемых репликаций и ведения журнала аудита, но мы видели много проблем, вызванных такими настройками, и не рекомендуем применять этот способ.
CSV
Подсистема хранения CSV может обрабатывать файлы с разделителями запятыми (comma-separated values, CSV) как таблицы, но не поддерживает индексы по ним. Эта подсистема позволяет импортировать и экспортировать данные во время работы сервера. Если вы экспортируете CSV-файл из электронной таблицы и сохраните в каталоге данных сервера MySQL, то сервер сможет сразу его прочитать. Аналогично, если вы записываете данные в таблицу CSV, внешняя программа сможет сразу же ее прочесть. Таким образом, таблицы CSV полезны в качестве формата обмена данными.
Federated
Эта подсистема хранения является своего рода прокси-сервером для других серверов. Она открывает клиентское соединение с другим сервером и выполняет там запросы к таблице, получая и отправляя строки по мере необходимости. Первоначально она продавалась в качестве конкурента для функций, поддерживаемых многими частными серверами баз данных корпоративного уровня, такими как Microsoft SQL Server и Oracle, но это было, мягко говоря, притянуто за уши. Подсистема хранения Federated выглядит способной обеспечивать высокую степень гибкости, однако она является источником многих проблем и по умолчанию отключена. Ее преемница FederatedX доступна в MariaDB.
Memory
Таблицы типа Memory (раньше называвшиеся таблицами типа HEAP) удобно использовать, когда необходимо получить быстрый доступ к данным, которые либо никогда не изменяются, либо не должны сохраняться после перезапуска сервера. Таблицы типа Memory обрабатываются на порядок быстрее, чем таблицы MyISAM. Все содержащиеся в них данные хранятся в памяти, поэтому запросам не нужно ждать выполнения операций дискового ввода/вывода. Структура таблицы Memory сохраняется после перезагрузки сервера, но данные теряются.
Вот несколько способов применения таблиц типа Memory:
- в качестве справочных таблиц или таблиц соответствия, таких как таблица, в которой почтовым индексам соответствуют названия регионов;
- для кэширования результатов периодического агрегирования данных;
- для получения промежуточных результатов при анализе данных.
Таблицы Memory поддерживают HASH-индексы, которые обеспечивают очень высокую скорость выполнения поисковых запросов. Эти таблицы работают очень быстро, но не всегда подходят для замены дисковых таблиц. Они используют табличную блокировку, что уменьшает конкуренцию при записи. Они не поддерживают столбцы типа TEXT
и BLOB
и допускают использование только строк фиксированной длины, поэтому значения типа VARCHAR
сохраняются как значения типа CHAR
, что увеличивает расход памяти. (Некоторые из этих ограничений сняты в Percona Server.)
MySQL использует подсистему Memory для внутреннего хранения промежуточных результатов при обработке запросов, которым требуется временная таблица. Если промежуточный результат становится слишком большим для таблицы Memory или содержит столбцы типа TEXT
или BLOB
, то MySQL преобразует его в таблицу MyISAM на диске.
Многие путают таблицы типа Memory с временными таблицами, которые создаются командой
CREATE TEMPORARY TABLE
. Временные таблицы могут
использовать любую подсистему хранения. Это не то же самое, что таблицы типа Memory. Временные таблицы видны только в одном соединении и исчезают, когда оно закрывается.
Merge
Подсистема хранения Merge является вариацией подсистемы MyISAM. Таблица типа Merge представляет собой виртуальную таблицу, состоящую из нескольких одинаковых по структуре таблиц MyISAM. Это может быть полезно, когда вы используете MySQL для ведения журнала и организации хранилища данных. Правда, эта возможность устарела — сейчас применяется секционирование.
NDB Cluster
MySQL АВ приобрела базу данных NDB у Sony Ericsson в 2003 году и создала подсистему хранения NDB Cluster в качестве интерфейса между SQL, используемым в MySQL, и собственным протоколом NDB. Комбинация сервера MySQL, подсистемы хранения NDB Cluster и распределенной, не поддерживающей разделения ресурсов, устойчивой к сбоям широкодоступной базы данных NDB называется MySQL Cluster. Мы еще обсудим MySQL Cluster позже.