====== Типы таблиц MySQL ====== ===== Таблицы MyISAM ===== Использовались по-умолчанию в MySQL вплоть до выхода в свет версии 5.5. Каждая MyISAM таблица хранится на диске в трёх файлах (в поддиректории каталога mysql/data), имена этих файлов совпадают с названием таблицы, а расширение может принимать одно из следующих значений: \\ **.frm** — структура таблицы, этот файл содержит информацию об именах и типах столбцов и индексов; \\ **.MYD** — в этом файле содержатся данные таблицы; \\ **.MYI** — в этом файле содержатся индексы таблицы. \\ * Таблицы MyISAM обладают рядом особенностей: * Данные хранятся в кроссплатформенном формате, что **позволяет переносить базы с сервера непосредственным копированием файлов**, минуя промежуточные формы. * Максимальное количество индексов — 64 (с версии 4.1.2). Каждый индекс может быть максимум из 16 столбцов. * С версии MySQL 4.1, для каждого текстового столбца может быть задана своя кодировка. * Допускается индексирование текстовых столбцов, в том числе и переменной длины. * Поддерживается полнотекстовый поиск. * Таблицы имеют специальный флаг, указывающий на правильность закрытия таблицы. Если сервер был остановлен аварийно, то при загрузке незакрытые флаги будут сигнализировать о возможных поврежденных таблицах и сервер попытается автоматически их проверить и восстановить. * Таблицы MyISAM можно проверять/восстанавливать при помощи утилиты **myisamchk**. * Таблицы MyISAM можно сжимать при помощи команды **myisampack**. В MyISAM поддерживается три различных типа таблиц. Два из них выбираются автоматически, в зависимости от типа используемых столбцов. Третий - сжатые таблицы - может быть создан только при помощи инструмента myisampack. ==== 1.Cтатические таблицы (с фиксированной длиной) ==== Это формат, принятый **по умолчанию**. Он используется, когда таблица не содержит столбцов VARCHAR, BLOB или TEXT. Данный формат - самый простой и безопасный, а также наиболее быстрый при работе с дисками. Скорость достигается за счет простоты поиска информации на диске: в таблицах статического формата с индексом для этого достаточно всего лишь умножить номер строки на ее длину. Кроме того, при сканировании таблицы очень просто считывать постоянное количество записей при каждом чтении с диска. Если произойдет сбой во время записи в файл MyISAM фиксированного размера, myisamchk в любом случае сможет легко определить, где начинается и заканчивается любая строка. Поэтому обычно удается восстановить все записи, кроме тех, которые были частично перезаписаны. ==== 2.Динамические таблицы ==== Формат используется для таблиц, которые содержат столбцы VARCHAR, BLOB или TEXT, а также если таблица была создана с параметром ROW_FORMAT=dynamic. Это несколько более сложный формат, так как у каждой строки есть заголовок, в котором указана ее длина. Одна запись может заканчиваться более чем в одном месте, если она была увеличена во время обновления. Чтобы произвести дефрагментацию таблицы, можно воспользоваться командами OPTIMIZE table или myisamchk. Если у вас есть статические данные, которые часто считываются/изменяются в некоторых столбцах VARCHAR или BLOB одной и той же таблицы, во избежание фрагментации эти динамические столбцы лучше переместить в другие таблицы. ==== 3.Сжатые таблицы ==== Таблицы этого тип предназначены только для чтения. Они генерируются при помощи дополнительного инструмента myisampack. Несмотря на то, что формат таблиц MyISAM очень надежен (все изменения в таблице записываются до возвращения значения оператора SQL), таблица, тем не менее, может быть повреждена. Такое происходит в следующих случаях: * Процесс mysqld уничтожен во время осуществления записи; * Неожиданное отключение компьютера (например, если выключилось электропитание); * Ошибка аппаратного обеспечения; * Использование внешней программы (например myisamchk) на открытой таблице. * Ошибка программного обеспечения в коде MySQL или MyISAM. ---- ===== Таблицы InnoDB ===== С MySQL 5.5 является типом по-умолчанию. Тип таблиц InnoDB разработан компанией Innobase. Таблицы такого типа предоставляют высокую производительность и устойчивое хранение данных в таблицах объёмом **до 1 Тбайт** и нагрузкой на сервер **до 800 вставок/обновлений в секунду**. Особенности типа InnoDB: * Все таблицы хранятся в едином табличном пространстве, поэтому имена таблиц должны быть уникальны. * Хранение данных в едином табличном пространстве позволяет снять ограничение на объём таблиц. Файл с таблицами может быть разбит на несколько частей и распределён по нескольким дискам или даже хостам. * Таблицы поддерживают автоматическое восстановление после сбоя. * Поддерживаются **транзакции**. * Этот тип таблиц в MySQL единственный, который поддерживает **каскадное удаление** и **внешние ключи**. * Выполняется блокировка **на уровне отдельных записей**. * Имеется расширенная поддержка кодировок. ---- ===== Таблицы MERGE ===== В MySQL существует тип таблиц MERGE (или таблица MRG_MyISAM), который представляет собой совокупность идентичных таблиц MyISAM, которые могут использоваться как одна таблица. К совокупности таблиц можно применять **только** **команды SELECT, DELETE и UPDATE**. Если же попытаться применить к таблице MERGE команду DROP, она подействует только на определение MERGE. ---- ===== Таблицы MEMORY ===== Следующий тип таблиц MEMORY (HEAP) хранится **в оперативной памяти**, из-за чего все запросы к таким таблицам выполняются очень быстро. Недостаток у таких таблиц один — полная потеря данных в случае сбоя работы сервера. В связи с этим в таких таблицах хранят в основном временные данные, которые можно легко восстановить заново. При создании таблицы типа MEMORY, создаётся один файл с расширением **frm**, в котором определяется структура таблицы. При остановке или перезагрузке сервера, данные о структуре таблицы остаются, но вся информация содержащаяся в этой таблице теряется, поскольку хранится только в оперативной памяти. При каждой перезагрузке сервера, пересоздавать таблицу не нужно, её структура остаётся. Таблицы типа MEMORY имеют ряд ограничений: * Индексы используются только в операциях сравнения с операторами "=" и "<=>", с другими операторами, такими как ">" или "<", индексирование столбцов не имеет смысла. * Как и с MERGE таблицами возможно использование только неуникальных индексов. * Не допустимы столбцы типов TEXT и BLOB. * До версии MySQL 4.1 в таблицах данного типа не поддерживаляс AUTO_INCREMENT. ---- ===== Таблицы EXAMPLE ===== Тип EXAMPLE является **заглушкой**, создать таблицу такого типа можно а вот получить или передать данные нельзя. При создании таблиц такого типа, как и с таблицами MEMORY создаётся только один файл frm, в нём определяется структура таблицы. \\ ---- ===== Таблицы BDB (BerkeleyDB) ===== Таблицы BDB обслуживаются транзакционным обработчиком BerkeleyDB, который разработан компанией Sleepycat. При создании таблиц этого типа формируются два файла: **.frm** - хранится структура таблицы. **.db** - хранятся данные и индексы. Особенности таблиц BDB: * Для таблиц **ведётся журнал**, что позволяет повысить устойчивость базы и увеличить вероятность успешного восстановления в случае сбоя. * Таблицы типа BDB хранятся в виде бинарных деревьев. Этот метод хранения замедляет сканирование таблицы (допустим для выборки всех строк таблицы) и увеличивает занимаемое таблицей место на диске. Однако поиск отдельных значений в таблице становится быстрее. Все остальные таблицы хранят в виде бинарных деревьев свои индексы. * Все таблицы BDB должны иметь первичный ключ, при отсутствии создаётся скрытый первичный ключ с атрибутом AUTO_INCREMENT. * Для данного типа таблиц поддерживаются транзакции на уровне страниц. * Подсчёт количества строк в таблице при помощи функции COUNT() происходит медленнее, из-за того что подсчёт строк для таблиц BDB (в отличие от MyISAM) на стороне сервера не поддерживается и полный пересчёт происходит при каждом обращении. * Ключи не являются упакованными, как в таблицах MyISAM и занимают больше места. * В случае, когда таблица BDB занимает всё свободное место на диске, происходит откат транзакции и вывод сообщения об ошибке. В отличие от BDB, таблицы MyISAM просто будут ждать появления свободного места, что приведёт к зависанию сервера. * **Файлы таблиц BDB нельзя переносить между системами простым копированием**, поскольку при их создании путь к файлу таблицы сохраняется. Для переноса базы необходимо использовать утилиту mysqldump.