Связь и интернет Архив Программирование
   
Сделать стартовойСделать закладку            
   ПОИСК  
   
Главная / MySQL / Типы таблиц MySQL /
8  Perl
8  PHP
8  JavaScript
8  HTML
8  DHTML
8  XML
8  CSS
8  C / C++
8  Pascal и Delphi
8  Турбо Ассемблер
8  MySQL
8  CASE-технологии
8  Алгоритмы
8  Python
8  Обратная связь
8  Гостевая книга
Новости о мире


Таблицы MERGE - Программирование от RIN.RU
Таблицы MERGE

Таблицы MERGE (объединение) являются новшеством версии MySQL 3.23.25. В настоящее время код находится еще на стадии разработки, но, тем не менее, должен быть достаточно стабилен.


Таблица MERGE (или таблица MRG_MyISAM) представляет собой совокупность идентичных таблиц MyISAM, которые могут использоваться как одна таблица. К совокупности таблиц можно применять только команды SELECT, DELETE и UPDATE. Если же попытаться применить к таблице MERGE команду DROP, она подействует только на определение MERGE.


Обратите внимание на то, что команда DELETE FROM merge_table без параметра WHERE очищает только распределение для таблицы, но ничего не удаляет из распределенных таблиц (мы планируем исправить это в версии 4.1).


Под идентичными таблицами подразумеваются таблицы, созданные с одинаковой структурой и ключами. Нельзя объединять таблицы, в которых столбцы сжаты разными методами или не совпадают, либо ключи расположены в другом порядке. Тем не менее, некоторые таблицы можно сжимать при помощи команды myisampack. См. раздел 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. См. раздел Синтаксис оператора 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(...)

  • Изменить файл '.MRG' и выполнить команду FLUSH TABLE над таблицей MERGE и всеми базовыми таблицами, чтобы обработчик прочитал новый файл определения.




Проблемы при работе с таблицами MERGE


При работе с таблицами MERGE могут возникать следующие проблемы:


  • Для таблицы MERGE не могут поддерживаться ограничения UNIQUE по всей таблице. При выполнении команды INSERT данные помещаются в первую или последнюю таблицу (в соответствии с INSERT_METHOD=xxx) и для этой таблицы MyISAM обеспечивается однозначность данных, но ей ничего не известно о первой таблице MyISAM.

  • Команда DELETE FROM merge_table без оператора WHERE очищает только распределение для таблицы, ничего не удаляя из преобразованных таблиц.

  • Использование команды RENAME TABLE над активной таблицей MERGE может привести к повреждению таблицы. Эта ошибка будет исправлена в MySQL 4.0.x.

  • При создании таблицы типа MERGE не проверяется совместимость типов базовых таблиц. Создав таблицу MERGE на основе несовместимых типов, вы можете столкнуться с непредсказуемыми проблемами.

  • Если для первого добавления индекса UNIQUE в таблицу, преобразованную в MERGE, используется команда ALTER TABLE, а затем командой ALTER TABLE в таблицу MERGE добавляется нормальный индекс, порядок ключей для таблиц будет разным, если в таблице был старый не однозначный ключ. Это происходит потому, что команда ALTER TABLE помещает ключи UNIQUE перед нормальными ключами, чтобы как можно раньше обнаружить дублирующиеся ключи.

  • Оптимизатор диапазона пока не может эффективно использовать таблицу MERGE, в связи с чем иногда возникают неоптимальные соединения. Это будет исправлено в MySQL 4.0.x.


Команда DROP TABLE над таблицей, преобразованной в таблицу MERGE, не будет работать под Windows, так как обработчик MERGE скрывает распределение таблиц от верхнего уровня MySQL. Поскольку в Windows не разрешается
удалять открытые файлы, сначала необходимо сбросить на диск все таблицы MERGE (при помощи команды FLUSH TABLES) или удалить таблицу MERGE перед тем, как удалить таблицу. Эту ошибку мы планируем исправить одновременно с введением VIEWs.



 8  Комментарии к статье  8 8  Обсудить в чате

8  В тему

Таблицы MyISAM

Таблицы ISAM

Таблицы BDB или Berkeley_DB

Таблицы HEAP

Таблицы InnoDB

 
  
  
    Copyright ©  RIN 2003 - 2004      * Обратная связь