Обычную таблицу можно преобразовать в реального времени (RT) или добавить к существующей RT-таблице.
Первый случай полезен, когда необходимо полностью перегенерировать RT-таблицу, что может потребоваться, например, если нужно обновить настройки токенизации. В этой ситуации подготовка обычной таблицы и её преобразование в RT-таблицу может быть проще, чем подготовка пакетного задания для выполнения INSERT-запросов для добавления всех данных в RT-таблицу.
Во втором случае обычно требуется добавить большой объём новых данных в RT-таблицу, и снова создание обычной таблицы с этими данными проще, чем заполнение существующей RT-таблицы.
Вы также можете присоединить существующую RT-таблицу к другой.
Оператор ATTACH позволяет преобразовать обычную таблицу для присоединения к существующей RT-таблице. Он также позволяет присоединить содержимое одной RT-таблицы к другой RT-таблице.
ATTACH TABLE plain_or_rt_table TO TABLE rt_table [WITH TRUNCATE]
После успешного выполнения ATTACH данные, изначально хранившиеся в исходной обычной таблице, становятся частью целевой RT-таблицы, а исходная обычная таблица становится недоступной (до следующей пересборки). Если исходная таблица является RT-таблицей, её содержимое перемещается в целевую RT-таблицу, а исходная RT-таблица остаётся пустой. ATTACH не приводит к каким-либо изменениям данных таблицы. По сути, он просто переименовывает файлы (превращая исходную таблицу в новый дисковый чанк целевой RT-таблицы) и обновляет метаданные. Таким образом, это, как правило, быстрая операция, которая может (часто) завершаться менее чем за секунду.
Обратите внимание, что когда таблица присоединяется к пустой RT-таблице, поля, атрибуты и настройки обработки текста (токенизатор, словоформы и т.д.) из исходной таблицы копируются и вступают в силу. Соответствующие части определения RT-таблицы из файла конфигурации будут проигнорированы.
При использовании опции TRUNCATE RT-таблица очищается перед присоединением исходной обычной таблицы. Это позволяет сделать операцию атомарной или гарантирует, что присоединяемая исходная обычная таблица будет единственными данными в целевой RT-таблице.
ATTACH TABLE имеет ряд ограничений. Наиболее важно, что в настоящее время требуется, чтобы целевая RT-таблица была либо пустой, либо имела те же настройки, что и исходная таблица. В случае, если исходная таблица присоединяется к непустой RT-таблице, данные RT-таблицы, собранные на данный момент, сохраняются как обычный дисковый чанк, а присоединяемая таблица становится новейшим дисковым чанком, при этом документы с одинаковыми ID помечаются как удалённые. Полный список ограничений следующий:
- Целевая RT-таблица должна быть либо пустой, либо иметь те же настройки, что и исходная таблица.
- В исходной таблице необходимо установить phrase_boundary_step равным 0 и stopword_step равным 1.
- Example
Перед ATTACH RT-таблица пуста и имеет 3 поля:
mysql> DESC rt;
Empty set (0.00 sec)
mysql> SELECT * FROM rt;
+-----------+---------+
| Field | Type |
+-----------+---------+
| id | integer |
| testfield | field |
| testattr | uint |
+-----------+---------+
3 rows in set (0.00 sec)Обычная таблица не пуста:
mysql> SELECT * FROM plain WHERE MATCH('test');
+------+--------+----------+------------+
| id | weight | group_id | date_added |
+------+--------+----------+------------+
| 1 | 1304 | 1 | 1313643256 |
| 2 | 1304 | 1 | 1313643256 |
| 3 | 1304 | 1 | 1313643256 |
| 4 | 1304 | 1 | 1313643256 |
+------+--------+----------+------------+
4 rows in set (0.00 sec)Присоединение обычной таблицы к RT-таблице:
mysql> ATTACH TABLE plain TO TABLE rt;
Query OK, 0 rows affected (0.00 sec)Теперь RT-таблица имеет 5 полей:
mysql> DESC rt;
+------------+-----------+
| Field | Type |
+------------+-----------+
| id | integer |
| title | field |
| content | field |
| group_id | uint |
| date_added | timestamp |
+------------+-----------+
5 rows in set (0.00 sec)И она не пуста:
mysql> SELECT * FROM rt WHERE MATCH('test');
+------+--------+----------+------------+
| id | weight | group_id | date_added |
+------+--------+----------+------------+
| 1 | 1304 | 1 | 1313643256 |
| 2 | 1304 | 1 | 1313643256 |
| 3 | 1304 | 1 | 1313643256 |
| 4 | 1304 | 1 | 1313643256 |
+------+--------+----------+------------+
4 rows in set (0.00 sec)После ATTACH обычная таблица удаляется и больше не доступна для поиска:
mysql> SELECT * FROM plain WHERE MATCH('test');
ERROR 1064 (42000): no enabled local indexes to search