RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
Visa 
4274 3200 2453 6495 

7.1 Таблицы MyISAM

MyISAM представляет собой заданный по умолчанию тип таблицы в MySQL Version 3.23. Он основан на коде ISAM и имеет много полезных расширений.

Индекс сохранен в файле с расширением .MYI (MYIndex), а данные сохранены в файле с расширением .MYD (MYData). Вы можете проверять и ремонтировать таблицы MyISAM командой myisamchk. Подробности в разделе "4.4.6.7 Использование myisamchk для ремонта". Вы можете сжимать таблицы MyISAM с помощью команды myisampack.

Следующее является новшествами в MyISAM:

  • Имеется флажок в файле MyISAM, который указывает, была таблица закрыта правильно или нет. Если mysqld запущен с опцией --myisam-recover, таблицы MyISAM будут автоматически проверены и восстановлены при открытии, если таблицы не были закрыты правильно.
  • Вы можете вставлять новые строки в таблицу, которая не имеет свободных блоков в середине файла данных, в то же самое время, когда другие процессы читают из таблицы (конкурентная вставка). Свободный блок может происходить из модификации строки динамической длины с большими данными в строку с меньшим количеством данных или при удалении строк. Когда все свободные блоки исчерпаны, все будущие вставки снова будут параллельны.
  • Поддержка больших (63-разрядных) файлов в операционных системах, которые поддерживают большие файлы.
  • Все данные сохранены с младшим байтом в начале. Это делает базу данных независимой от ОС и платформы. Единственное требование: машина должна использовать целые числа со знаком и формат IEEE чисел с плавающей точкой. Единственная область машин, которые не могут поддерживать двоичную совместимость, это встроенные системы (потому, что они иногда имеют специфические процессоры и чипсеты).
  • Все числовые ключи сохранены со старшим байтом в начале, чтобы дать лучшее индексное сжатие.
  • Внутренняя обработка одного столбца AUTO_INCREMENT. MyISAM автоматически модифицирует его на операциях INSERT/UPDATE. Значение AUTO_INCREMENT может быть сброшено с помощью myisamchk. Это делает столбцы AUTO_INCREMENT быстрее (по крайней мере на 10%), а старые числа не будет многократно использоваться, как это было со старым ISAM. Обратите внимание, что когда AUTO_INCREMENT определен на конце ключа из нескольких частей, работает старое поведение.
  • Когда выполняется вставка в сортируемом порядке (например, когда Вы используете столбец AUTO_INCREMENT), дерево ключей будет поделено так, чтобы высокий узел содержал только один ключ. Это улучшит использование места в дереве ключей.
  • Столбцы типов BLOB и TEXT теперь могут быть корректно индексированы.
  • Значения NULL позволяются в индексированных столбцах. Это занимает 0-1 байт на ключ.
  • Максимальная длина ключа по умолчанию 500 байт (может быть изменена при перекомпиляции). В случаях ключей длиннее, чем 250 байт, используется больший размер блока ключа (по умолчанию 1024 байт).
  • Максимальное количество ключей в таблице по умолчанию 32. Это может быть расширено до 64 без перекомпиляции.
  • myisamchk может помечать таблицы как проверенные при запуске с опцией --update-state. myisamchk --fast проверит только те таблицы, которые не имеют этой метки.
  • myisamchk -a сохраняет статистику для частей ключа (а не только для целых ключей, как это было в ISAM).
  • Динамические строки будут теперь намного меньше фрагментированы, когда происходит удаление с модификациями и вставками. Это выполнено объединением смежных удаленных блоков и расширением блоков, если следующий блок удален.
  • myisampack может сжимать столбцы типов BLOB и VARCHAR.
  • Вы можете размещать файл данных и индексный файл в различных каталогах, чтобы получить большее быстродействие (с помощью опций DATA/INDEX DIRECTORY="path" инструкции CREATE TABLE).

MyISAM также поддерживает следующие вещи, которые MySQL будет способен использовать в ближайшем будущем:

  • Поддержка настоящего типа VARCHAR: столбец VARCHAR начинается с длины, сохраненной в 2 байтах.
  • Таблицы с VARCHAR теперь смогут иметь фиксированную или динамическую длину записей.
  • VARCHAR и CHAR могут быть длиной до 64 КБ. Все сегменты ключа имеют их собственное определение. Это даст возможность MySQL иметь различные определения для столбцов.
  • Хэшированный индекс может использоваться для UNIQUE. Это позволит Вам иметь UNIQUE на любой комбинации столбцов в таблице. (Но Вы не сможете искать на UNIQUE индексе).

Обратите внимание, что индексные файлы обычно намного меньше у MyISAM, чем у ISAM. Это означает, что MyISAM обычно будет использовать меньшее количество ресурсов системы, чем ISAM, но будет нуждаться в большем времени CPU при вставке данных в сжатый индекс.

Следующие параметры mysqld могут использоваться, чтобы изменить поведение таблиц MyISAM. Подробности в разделе "4.5.5.4 Синтаксис SHOW VARIABLES ".

ОпцияЧто она делает
--myisam-recover=#Автоматически восстанавливаются поврежденные таблицы.
-O myisam_sort_buffer_size=#Буфер, используемый при восстановлении таблиц.
--delay-key-write-for-all-tablesНе сбрасывать буфер ключей на диск между записями для любой MyISAM таблицы.
-O myisam_max_extra_sort_file_size=# Используется, чтобы помочь MySQL решить, когда использовать медленный но безопасный метод создания индекса кэша ключей. ОБРАТИТЕ ВНИМАНИЕ , что этот параметр задан в мегабайтах!
-O myisam_max_sort_file_size=#Не использовать быстрый метод сортировки для созданного индекса, если временный файл больше, чем здесь указано. ОБРАТИТЕ ВНИМАНИЕ, что этот параметр задан в мегабайтах!

Автоматическое восстановление активизировано, если Вы запускаете mysqld с опцией --myisam-recover=#. Подробности в разделе "4.1.1 Параметры командной строки mysqld". При открытии таблица будет проверена, если она отмечена как поврежденная, или если счетчик открытий для нее не равен 0, и Вы работаете с опцией --skip-locking. Если хоть одно из этих условий выполнено, происходит следующее:

  • Таблица будет проверена на ошибки.
  • Если мы находим ошибку, попробуйте сделать быстрый ремонт (с сортировкой, но без пересоздания файла данных) таблицы.
  • Если ремонт терпит неудачу из-за ошибки в файле данных (например, ошибка дублирования ключа), попробуйте снова, но на сей раз пересоздайте файл данных.
  • Если и это не помогает, повторите восстановление еще раз со старым методом ремонта, который способен выправить любой тип ошибки с относительно небольшими дисковыми требованиями.

Если ремонт не смог восстановить все строки из предыдущей завершенной инструкции, и Вы не определяли FORCE как опцию для myisam-recover, автоматический ремонт прервется с сообщением об ошибках в файле:

Error: Couldn't repair table: test.g00pages

Если Вы в этом случае использовали опцию FORCE, Вы будете взамен иметь предупреждение в файле ошибки:

Warning: Found 344 of 354 rows when repairing ./test/g00pages

Обратите внимание, что если Вы выполняете автоматический ремонт с опцией BACKUP, Вы должны иметь скрипт в cron, который автоматически перемещает файлы с именами, подобными tablename-datetime.BAK, из каталогов баз данных.

7.1.1 Место для ключей

MySQL может поддерживать различные индексные типы, но нормальный тип ISAM или MyISAM. Они используют индекс B-дерева, и Вы можете грубо вычислять размер для индексного файла как (key_length+4)/0.67. Это для самого плохого случая, когда все ключи вставлены в сортируемом порядке, и мы не имеем сжатых ключей.

Индексы строк сжимаются. Если первая индексная часть представляет собой строку, она также будет префиксно сжата. Сжатие делает индексный файл меньше, чем вышеупомянутые объекты, если столбец строки имеет много конечных пробелов или столбец типа VARCHAR, который не всегда используется для данных полной длины. Префиксное сжатие используется на ключах, которые начинаются со строки. Префиксное сжатие хорошо помогает, если имеется много строк с идентичным префиксом.

В таблицах MyISAM Вы можете также сжимать числа, определяя PACK_KEYS=1, когда Вы создаете таблицу. Это помогает, когда Вы имеете много целочисленных ключей, которые имеют идентичный префикс, когда числа сохранены в формате со старшим байтом в начале.

7.1.2 Формат таблиц MyISAM

MyISAM поддерживает 3 различных типа таблиц. Два из них будут выбраны автоматически в зависимости от типа столбцов, которые Вы используете. Третий тип, сжатые таблицы, может быть создан только с помощью внешнего инструмента myisampack.

7.1.2.1 Таблицы статических (фиксированной длины) характеристик

Это заданный по умолчанию формат. Он используется, когда таблица не содержит столбцов типов VARCHAR, BLOB или TEXT.

Этот формат самый простой и наиболее безопасный. Он также самый быстрый из дисковых форматов. Быстродействие исходит из простого пути, которым данные могут быть найдены на диске. При поиске чего-либо с индексом и статическим форматом это очень просто. Только умножите номер строки на длину строки.

Также при просмотре таблицы очень просто читать постоянное число записей за каждую дисковую операцию чтения.

Кроме того, myisamchk обычно может исправлять все записи за исключением частично записанных. Обратите внимание, что в MySQL все индексы могут всегда восстанавливаться.

  • Все CHAR, NUMERIC и DECIMAL столбцы дополняются пробелами до ширины столбца.
  • Очень быстро работает.
  • Просто кэшировать.
  • Простой восстанавливать после аварийного отказа потому, что записи размещены в фиксированных позициях.
  • Не должен быть реорганизован myisamchk, если огромное число записей не удалено, и Вы хотите возвращать свободное дисковое пространство операционной системе.
  • Обычно требует большего количества дискового пространства, чем динамические таблицы.

7.1.2.2 Характеристики динамических таблиц

Этот формат используется, если таблица содержит столбцы типов VARCHAR, BLOB или TEXT, или если таблица была создана с опцией ROW_FORMAT=dynamic.

Этот формат немного сложнее потому, что каждая строка должна иметь заголовок, указывающий ее длину. Одна запись может также заканчиваться не в одном месте, когда она удлиннилась при обновлении.

Вы можете использовать OPTIMIZE table или myisamchk для дефрагментации таблицы. Если Вы имеете статические данные, к которым часто обращаетесь или меняете их, неплохо бы переместить эти динамические столбцы (например, VARCHAR или BLOB) в другие таблицы, чтобы избежать фрагментации:

  • Все столбцы строк динамические (за исключением тех, чья длина меньше 4).
  • Каждой записи предшествует образ, указывающий, которые столбцы являются пустыми ('') для строковых столбцов или равными нулю для числовых столбцов (это не столбцы, содержащие значения NULL). Если столбец строки имеет нулевую длину после удаления конечных пробелов, или числовой столбец имеет нулевое значение, это отмечено в битовом массиве и не сохранено на диск. Непустые строки сохранены как байт длины плюс строка.
  • Обычно требуется намного меньше дисковое пространство, чем для таблицы с фиксированной длиной данных.
  • Каждая запись берет ровно столько места, сколько ей надо.
  • Если Вы модифицируете строку с информацией, которая увеличивает длину строки, строка будет фрагментирована. В этом случае Вам, вероятно, придется время от времени выполнять myisamchk -r, чтобы получить лучшую эффективность. Используйте myisamchk -ei tbl_name для сбора некоторой статистики о таблице.
  • Не так просто восстанавливать после аварийного отказа потому, что запись может быть фрагментирована на многие части, и связь (фрагмент записи) может просто отсутствовать в таблице.
  • Ожидаемая длина строки для динамических записей:
    3+(number of columns+7)/8+(number of char columns)+
    packed size of numeric columns+length of strings+
    (number of NULL columns+7)/8
    
    Еще надо по 6 байт для каждой связи. Динамическая запись связана всякий раз, когда модификация вызывает расширение записи. Каждая новая связь будет по крайней мере 20 байт, так что следующее расширение, вероятно, войдет в ту же самую связь. Если нет, то будет создана другая связь. Вы можете проверять сколько там связей вызовом myisamchk -ed. Все связи могут быть удалены с помощью команды myisamchk -r.

7.1.2.3 Характеристики сжатых таблиц

Этот тип таблиц предназначен только для чтения, он может быть сгенерирован инструментом myisampack (pack_isam для таблиц типа ISAM):

  • Все дистрибутивы MySQL могут читать таблицы, которые были сжаты myisampack.
  • Сжатые таблицы занимают очень небольшое дисковое пространство. Это минимизирует требования к диску, что очень удобно при использовании медленных дисков (например, CD-ROM).
  • Каждая запись будет сжата отдельно. Заголовок для записи фиксирован (1-3 байта) в зависимости от самой большой записи в таблице. Каждый столбец сжимается по отдельности. Некоторые из типов сжатия:
    • Обычная Huffman-таблица различий для каждого столбца.
    • Суффиксное сжатие пробелов.
    • Префиксное сжатие пробелов.
    • Числа со значением 0 будут сохранены, используя 1 бит.
    • Если значения в целочисленном столбце имеют маленький диапазон, столбец будет сохранен, используя самый маленький возможный тип. Например, столбец BIGINT (8 байт) может быть сохранен как столбец TINYINT (1 байт), если все значения находятся в диапазоне от 0 до 255.
    • Если столбец имеет только маленький набор возможных значений, тип столбца будет преобразован в ENUM.
    • Столбец может использовать комбинацию вышеупомянутых сжатий.
  • Можно обрабатывать записи с фиксированной или динамической длиной, но не столбцы BLOB или TEXT.
  • Можно расжать таблицу с помощью myisamchk.

7.1.3 Проблемы с таблицами MyISAM.

Формат файла, который использует MySQL, чтобы хранить данные, был многократно тщательно проверен, но всегда найдутся обстоятельства, которые могут разрушить таблицы базы данных.

7.1.3.1 Поврежденные таблицы MyISAM

Несмотря на то, что формат таблиц MyISAM очень надежен (все изменения для таблицы будут записаны перед возвратами инструкций SQL), Вы можете получать разрушенные таблицы, если случаются некоторые из следующих вещей:

  • Процесс mysqld рухнул посреди записи.
  • Непредвиденное закрытие системы (например, если компьютер выключен).
  • Аппаратная ошибка.
  • Вы используете внешнюю программу (например, myisamchk) на работающей таблице.
  • Программная ошибка в коде MySQL или MyISAM.

Типичные признаки для разрушенной таблицы:

  • Вы получаете ошибку Incorrect key file for table: '...'. Try to repair it при выборе данных из таблицы.
  • Запросы не находят строки в таблице или возвращают незавершенные данные.

Вы можете проверять, является ли таблица исправной, с помощью команды CHECK TABLE. Подробности в разделе "4.4.4 Синтаксис CHECK TABLE ".

Вы можете отремонтировать разрушенную таблицу с помощью команды REPAIR TABLE. Подробности в разделе "4.4.5 Синтаксис REPAIR TABLE ". Вы можете также отремонтировать таблицу, когда mysqld не запущен с помощью команды myisamchk.

В этом случае наиболее важная вещь, знать из-за чего таблица была повреждена. Проверить, не разрушался ли недавно mysqld легко: если в файле ошибок mysqld имеется недавняя строка перезапуска restarted mysqld, значит, разрушался и был перезапущен автоматически. Если это не имеет место, значит, что-то не так с сервером.

7.1.3.2 Клиентура использует или не закрыла таблицу правильно

Каждый MyISAM-файл .MYI имеет в заголовке счетчик, который может использоваться, чтобы проверить, была ли таблица закрыта правильно.

Если Вы получаете следующее предупреждение из CHECK TABLE или myisamchk:

# clients is using or hasn't closed the table properly

Это означает, что этот счетчик вышел из синхронизации. Это пока еще не означает, что таблица разрушена, но Вы должны по крайней мере сделать проверку таблицы, чтобы удостовериться, что она в порядке.

Счетчик работает следующим образом:

  • Первый раз, когда таблица модифицируется в MySQL, счетчик в заголовке индексных файлов будет автоматически увеличен.
  • Счетчик не будет изменен в течение дальнейших модификаций.
  • Когда последний образец таблицы закрыт (вызовом FLUSH или потому, что не имеется участка памяти в кэше таблицы) счетчик уменьшается, если таблица модифицировалась в любом месте.
  • Когда Вы ремонтируете или проверяете таблицу, и она в порядке, счетчик будет принудительно сброшен в 0.
  • Чтобы избежать проблем со взаимодействием с другими процессами, которые могут делать проверку на таблице, счетчик не уменьшается при закрытии, если он уже равен 0.

Другими словами, единственные пути, которыми он может выйти из синхронизации такие:

  • MyISAM-таблицы скопированы без LOCK и FLUSH TABLES.
  • MySQL рухнул между модификацией и конечным завершением. Обратите внимание, что таблица может все еще быть правильной, поскольку MySQL всегда записывает изменения между командами.
  • Кто-то сделал myisamchk --repair или myisamchk --update-state на таблица, которая была в использовании у mysqld.
  • Много серверов mysqld используют таблицу, и каждый сделал REPAIR или CHECK, в то время как таблица использовалась другим сервером. В этой ситуации команда CHECK безопасна (даже если Вы получите предупреждение с других серверов), но вот REPAIR нужно избегать, поскольку это в настоящее время заменяет файл данных на новый, который не будет передан на другие серверы.

Поиск

 

Найди своих коллег!