7.1.3.2 Clients is using or hasn't closed the table properly | Оглавление | 7.2.1 Проблемы при работе с таблицами MERGE |
Таблицы MERGE
(объединение) являются новшеством версии MySQL 3.23.25. В настоящее время код находится еще на стадии разработки, но, тем не менее, должен быть достаточно стабилен.
Таблица MERGE
(или таблица MRG_MyISAM
) представляет собой совокупность идентичных таблиц MyISAM
, которые могут использоваться как одна таблица. К совокупности таблиц можно применять только команды SELECT
, DELETE
и UPDATE
. Если же попытаться применить к таблице MERGE
команду DROP
, она подействует только на определение MERGE
.
Обратите внимание на то, что команда DELETE FROM merge_table
без параметра WHERE
очищает только распределение для таблицы, но ничего не удаляет из распределенных таблиц (мы планируем исправить это в версии 4.1).
Под идентичными таблицами подразумеваются таблицы, созданные с одинаковой структурой и ключами. Нельзя объединять таблицы, в которых столбцы сжаты разными методами или не совпадают, либо ключи расположены в другом порядке. Тем не менее, некоторые таблицы можно сжимать при помощи команды myisampack
. See section 4.7.4 myisampack
, MySQL-генератор сжатых таблиц (только для чтения).
При создании таблицы MERGE
будут образованы файлы определений таблиц `.frm' и списка таблиц `.MRG'. Файл `.MRG' содержит список индексных файлов (файлы `.MYI'), работа с которыми должна осуществляться как с единым файлом. Все используемые таблицы должны размещаться в той же базе данных, что и таблица MERGE
.
На данный момент по отношению к таблицам, которые необходимо преобразовать в таблицу MERGE
,необходимо обладать привилегиями SELECT
, UPDATE
и DELETE
.
Ниже перечислены возможности, которые обеспечивают таблицы MERGE
:
myisampack
, а затем создать таблицу MERGE
, чтобы использовать их как одну таблицу.MERGE
может обрабатываться намного быстрее, чем обычная большая таблица (можно, конечно, воспользоваться дисковым массивом RAID
, чтобы получить те же преимущества).MERGE
таблиц, одновременно используя таблицу MERGE
для других запросов. Можно даже иметь несколько активных таблиц MERGE
(возможно, с перекрывающимися файлами).MERGE
, чем пытаться восстановить действительно большой файл.MERGE
используются индексы отдельных таблиц; поддерживать для нее один большой индекс нет необходимости. Благодаря этому создание или изменение таблиц MERGE
осуществляется ОЧЕНЬ быстро. Обратите внимание на то, что при создании таблицы MERGE
необходимо указывать определения ключей!MERGE
. Это намного быстрее и позволит сэкономить дисковое пространство.MERGE
позволяют обходить ограничения на размер файлов в операционных системах.MERGE
к одной таблице. Заметного падения производительности при этом наблюдаться не будет (только пара непрямых вызовов и вызовы memcpy()
при каждом чтении).Недостатки таблиц MERGE
:
MERGE
можно использовать только идентичные таблицы MyISAM
.AUTO_INCREMENT
не обновляются автоматически при применении команды INSERT
.REPLACE
.MERGE
используется больше дескрипторов файлов. Если применяется таблица MERGE
, преобразованная из более чем 10 таблиц, к которым получают доступ 10 пользователей, то используется 10*10 + 10 дескрипторов файлов (10 файлов данных для 10 пользователей и 10 общих индексных файлов).MERGE
необходимо прочитать все базовые таблицы, чтобы выяснить, какая из них больше всего соответствует указанному ключу. Если после этого выполнить команду ``читать следующий'', то обработчик объединенной таблицы должен будет просмотреть буферы чтения, чтобы найти следующий ключ. Только по завершении использования одного буфера ключей обработчику понадобится прочитать следующий блок ключей. В связи с этим ключи MERGE
дают большое замедление при поиске eq_ref
, однако не такое значительное при поиске ref
. See section 5.2.1 Синтаксис оператора EXPLAIN
(получение информации о SELECT
).DROP TABLE
, ALTER TABLE
или DELETE FROM table_name
без оператора WHERE
по отношению к таблицам, которые размещены в таблице MERGE
и открыты. Если это сделать, в таблице MERGE
останутся ссылки на исходную таблицу, и полученные результаты будут совершенно непредсказуемыми.При создании таблицы MERGE
необходимо указать при помощи UNION(list-of-tables)
, какие таблицы требуется использовать как одну. В случае необходимости, если требуется производить вставку в таблицу MERGE
в первую или в последнюю таблицу в списке UNION
, можно задать INSERT_METHOD
. Если не указать INSERT_METHOD
или выбрать NO
, то все команды INSERT
для таблицы MERGE
будут выдавать ошибку.
В приведенном ниже примере показано, как использовать таблицы MERGE
:
CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY, message CHAR(20)); CREATE TABLE t2 (a INT AUTO_INCREMENT PRIMARY KEY, message CHAR(20)); INSERT INTO t1 (message) VALUES ("Testing"),("table"),("t1"); INSERT INTO t2 (message) VALUES ("Testing"),("table"),("t2"); CREATE TABLE total (a INT NOT NULL, message CHAR(20), KEY(a)) TYPE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;
Обратите внимание на то, что мы не создавали UNIQUE
или PRIMARY KEY
в таблице total
, так как в этой таблице ключ не будет уникальным.
Кроме того, можно управлять файлом `.MRG', находясь за пределами сервера MySQL:
shell> cd /mysql-data-directory/current-database shell> ls -1 t1.MYI t2.MYI > total.MRG shell> mysqladmin flush-tables
Теперь можно выполнять следующие действия:
mysql> SELECT * FROM total; +---+---------+ | a | message | +---+---------+ | 1 | Testing | | 2 | table | | 3 | t1 | | 1 | Testing | | 2 | table | | 3 | t2 | +---+---------+
Чтобы повторно преобразовать таблицу MERGE
, можно выбрать один из следующих вариантов:
DROP
и создать ее повторноALTER TABLE table_name UNION(...)
FLUSH TABLE
над таблицей MERGE
и всеми базовыми таблицами, чтобы обработчик прочитал новый файл определения.7.1.3.2 Clients is using or hasn't closed the table properly | Оглавление | 7.2.1 Проблемы при работе с таблицами MERGE |