MyISAM: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[отпатрулированная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
→‎Ссылки: удален форум - dead link - редкая проблема +1whitepaper from mysql/oracel
стилевые правки, дополнение, уточнение, +ref
Строка 21: Строка 21:
|website =
|website =
}}
}}
'''MyISAM''' — одна из основных (наряду с [[InnoDB]]) систем хранения данных в [[СУБД]] [[MySQL]]. Она основывается принципах [[ISAM]] и обладает в сравнении с ним рядом полезных дополнений.
'''MyISAM''' — одна из основных (наряду с [[InnoDB]]) систем хранения данных в [[СУБД]] [[MySQL]]. Она основывается принципах [[ISAM]] и обладает в сравнении с ним рядом полезных дополнений. Поддерживается с версий MySQL 3.x, до версий MySQL 5.5 являлась системой хранения по умолчанию. MyISAM имеет возможности по сжатию данных, по созданию полнотекстовых индексов. Однако не является устойчивой к сбоям и не выполняет требования [[ACID]].<ref>http://www.percona.com/files/presentations/percona-live/nyc-2011/PerconaLiveNYC2011-Switching-to-Innodb-from-MyISAM.pdf</ref>


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

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


Для таблиц этого типа создан ряд специализированных утилит, позволяющих манипулировать табличными файлами. Сюда входят утилита myisamchk для проверки и восстановления таблиц и индексов (требует полной остановки процесса MySQL и создает время неработоспособности системы, исполнение заключается в создании с нуля нового целостного файла таблицы и перезаписи данных в него) и утилита myisampack для создания сжатых таблиц.
Для таблиц этого типа создан ряд специализированных утилит, позволяющих манипулировать табличными файлами. Сюда входят утилита myisamchk для проверки и восстановления таблиц и индексов (требует полной остановки процесса MySQL и создает время неработоспособности системы, исполнение заключается в создании с нуля нового целостного файла таблицы и перезаписи данных в него) и утилита myisampack для создания сжатых таблиц.
Строка 31: Строка 33:
Индексные файлы имеют расширение .MYI (MYIndex). Файлы с расширением .MYD (MYData) содержат данные, а с расширением .frm — схему таблицы. Если индексный файл по какой-то причине теряется, программа перестраивает индексы, используя информацию из frm-файла.
Индексные файлы имеют расширение .MYI (MYIndex). Файлы с расширением .MYD (MYData) содержат данные, а с расширением .frm — схему таблицы. Если индексный файл по какой-то причине теряется, программа перестраивает индексы, используя информацию из frm-файла.


По умолчанию в каждой таблице может быть не более тридцати двух индексов, но это значение можно повысить до шестидесяти четырёх. Индексы создаются в виде [[двоичное дерево|двоичных деревьев]]. Разрешается индексировать столбцы типа [[BLOB]] и TEXT, а также столбцы, допускающие значения NULL.
По умолчанию в каждой таблице может быть не более тридцати двух индексов, но это значение можно повысить до шестидесяти четырёх. Индексы создаются в виде [[двоичное дерево|двоичных деревьев]]<!-- а.. не деревья поиска? btree-->. Разрешается индексировать столбцы типа [[BLOB]] и TEXT, и столбцы, допускающие значения NULL.


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


== Недостатки ==
== Недостатки ==
* Отсутствует поддержка [[Транзакция (информатика)|транзакций]] и [[ссылочная целостность|внешних ключей]].

* Отсутствие самовосстановления по журналу при сбоях (возможность присутствует во всех развитых СУБД).
* Отсутствие самовосстановления по журналу при сбоях (возможность присутствует во всех развитых СУБД).
* Отсутствие блокировок регионов, меньших, чем целые таблицы. Приводит к отсутствию масштабируемости, то есть к сильной деградации производительности с повышением нагрузки.
* Отсутствие блокировок регионов, меньших, чем целые таблицы. Приводит к отсутствию масштабируемости, то есть к сильной деградации производительности с повышением нагрузки.
* Отсутствие средств резервного копирования. Утилита mysqldump, предлагаемая для создания резервных копий, является не инструментом резервного копирования, а инструментом экспорта в текст (в последовательность операторов [[Insert (SQL)|INSERT]], воссоздающих содержимое таблицы). Для выполнения задачи с сохранением целостности базы данных mysqldump блокирует таблицы, приводя к полной остановке работы системы на всё время своего исполнения. Остановка процесса MySQL и создание копии инструментами копирования файлов из [[UNIX]] (например, [[gzip]] в режиме минимальной компрессии) приводит к меньшему времени простоя системы.{{нет АИ|23|09|2012}}
* Отсутствие средств резервного копирования. Утилита mysqldump, предлагаемая для создания резервных копий, является не инструментом резервного копирования, а инструментом экспорта в текст (в последовательность операторов [[Insert (SQL)|INSERT]], воссоздающих содержимое таблицы). Для выполнения задачи с сохранением целостности базы данных mysqldump блокирует таблицы, приводя к полной остановке работы системы на всё время своего исполнения.
* Для лучшей работы оптимизатора запросов может потребоваться периодическое исполнение команды ANALYZE.
* Слабая реализация сортировки, которой является [[клауза|предложение]] 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]]{{нет АИ|29|11|2013}}.
* Слабая реализация сортировки, при использовании [[клауза|предложение]] ORDER BY языка [[SQL]] и отсутствии подходящего индекса. MyISAM [[Сортировка слиянием|сортирует данные слиянием]], с использованием [[qsort]] для первоначально сливаемых небольших регионов. Это требует не только крайне неоптимального по дисковому вводу-выводу создания на каждую операцию сортировки 2 временных файлов, растущих с нулевого размера, с работой с ними через неоптимальные вызовы fopen() и fwrite(), но и выделения sort buffer для каждого клиента MySQL. Размер sort buffer (устанавливается параметром настройки MySQL sort_buffer_size) для достижения оптимальной производительности должен быть порядка сотен килобайт, что под большой нагрузкой приводит к полному исчерпанию не только [[Куча (нераспределённая память)|кучи]], но и пользовательского адресного пространства в 32-битных ОС семейства [[UNIX]] (во [[FreeBSD]] на x86 — 3 ГБ), и влечет за собой отказы вызовов malloc() во всем коде MySQL, а не только в коде сортировки.

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


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


== Ссылки ==
== Ссылки ==

Версия от 10:40, 20 августа 2014

MyISAM
Тип СУБД (Storage Engine для MySQL)
Разработчик Oracle
Написана на Си
Лицензия GPLv2
Сайт dev.mysql.com/doc… (англ.)

MyISAM — одна из основных (наряду с InnoDB) систем хранения данных в СУБД MySQL. Она основывается принципах ISAM и обладает в сравнении с ним рядом полезных дополнений. Поддерживается с версий MySQL 3.x, до версий MySQL 5.5 являлась системой хранения по умолчанию. MyISAM имеет возможности по сжатию данных, по созданию полнотекстовых индексов. Однако не является устойчивой к сбоям и не выполняет требования ACID.[1]

Описание

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

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

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

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

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

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

Недостатки

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

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

Примечания

Ссылки