MyISAM

Материал из Seo Wiki - Поисковая Оптимизация и Программирование

Перейти к: навигация, поиск

MyISAM – стандартная подсистема низкого уровня в MySQL. Он основывается на коде ISAM и обладает в сравнении с ним большим количеством полезных дополнений. Для таблиц этого типа создан ряд специализированных утилит, позволяющих манипулировать табличными файлами. Сюда входят утилита myisamchk для проверки и восстановления таблиц и индексов (требует полного останова процесса MySQL и создает время неработоспособности системы, исполнение заключается в создании с нуля нового целостного файла таблицы и перезаписи данных в него) и утилита myisampack для создания сжатых таблиц.

MyISAM-таблицы идеально оптимизированы для использования в WWW, где преобладают запросы на чтение. Таблицы типа MyISAM показывают хорошие результаты при выборках SELECT. Во многом это связано с отсутствием поддержки транзакций и внешних ключей. Однако при модификации и добавлении записей вся таблица кратковременно блокируется, это может привести к серьёзным задержкам при большой загрузке.

Таблицы MyISAM являются платформенно-независимыми. Табличные файлы можно перемещать между компьютерами разных архитектур и разными операционными системами без всякого преобразования. Для этого MySQL хранит все числа с плавающей запятой в формате IEEE, а все целые числа — в формате с прямым порядком следования байтов.

Индексные файлы имеют расширение .MYI (MYIndex). Файлы с расширением .MYD (MYData) содержат данные, а с расширением .frm – схему таблицы. Если индексный файл по какой-то причине теряется, программа перестраивает индексы, используя информацию из frm-файла.

По умолчанию в каждой таблице может быть не более тридцати двух индексов, но это значение можно повысить до шестидесяти четырех. Индексы создаются в виде двоичных деревьев. Разрешается индексировать столбцы типа BLOB и TEXT, а также столбцы, допускающие значения NULL.

В таблицах MyISAM могут быть фиксированные, динамические либо сжатые записи. Выбор между фиксированным и динамическим форматом диктуется определениями столбцов. Для создания сжатых таблиц предназначена утилита myisampack.

Недостатки

  • отсутствие самовосстановления по журналу при сбоях (возможность присутствует во всех развитых СУБД)
  • отсутствие блокировок регионов, меньших, чем целые таблицы. Приводит к отсутствию масштабируемости, т.е. к сильной деградации производительности с повышением нагрузки.
  • отсутствие средств резервного копирования. Утилита mysqldump, предлагаемая для создания резервных копий, является не инструментом резервного копирования, а инструментом экспорта в текст (в последовательность операторов INSERT, воссоздающих содержимое таблицы). Для выполнения задачи с сохранением целостности базы данных mysqldump захватывает блокировку таблицы, приводя к полной остановке работы системы на все время своего исполнения. Останов процесса MySQL и создание копии инструментами копирования файлов из UNIX приводит к меньшему времени простоя системы. Особенно удачен для этого gzip в режиме минимальной компрессии, который при незначительной для современного оборудования нагрузке процессора снижает объем данных, подлежащих записи в полученный файл, и тем самым ускоряет операцию.
  • слабая реализация сортировки, которой является клауза ORDER BY языка SQL при отсутствии подходящего индекса. MyISAM сортирует данные слиянием, с использованием qsort для первоначально сливаемых небольших регионов. Это требует не только крайне неоптимального по дисковому вводу/выводу создания на каждую операцию сортировки 2 временных файлов, растущих с нулевого размера, с работой с ними через неоптимальные вызовы fopen() и fwrite(), но и выделения sort buffer для каждого клиента MySQL. Размер sort buffer (устанавливается параметром настройки MySQL sort_buffer_size) для достижения оптимальной производительности должен быть порядка сотен килобайт, что под большой нагрузкой приводит к полному исчерпанию не только кучи, но и пользовательского адресного пространства в 32-битных ОС семейства UNIX (во FreeBSD на x86 - 3ГБ), и влечет за собой отказы вызовов malloc() во всем коде MySQL, не только в коде сортировки. Так как такие отказы далеко не всегда проверяются в коде, результатом может быть крах MySQL по сигналу SIGSEGV. Стоит отметить что проблема с адресным пространством пользователя не присутствует в 64-битных операционных системах и на 2009 год большая часть выпускаемых серверов снабжена значительно большим объемом памяти чем 4Гб, что способствует использованию именно 64-битных систем для полного использования возможностей оборудования, поэтому этот недостаток в данный момент становится менее критичен.

Данные недостатки проявляются в заметной степени на нагрузке порядка 400 клиентов, исполняющих сложные запросы по базе данных размеров 2-3ГБ.

В более развитых реализациях нижнего уровня MySQL, таких, как InnoDB, значительная часть данных проблем решена. Данные проблемы также могут решаться их учетом при разработке приложения, работающего с MySQL.

Ссылки

cs:MyISAM de:MyISAM en:MyISAM es:MyISAM fr:MyISAM it:MyISAM pl:MyISAM tr:MyISAM zh:MyISAM

Источник — «http://www.sbup.com/wiki/MyISAM»
Личные инструменты

Served in 0.182 secs.