Виды таблиц и способ их хранения
MyISAM
MyISAM – это стандартный тип таблиц в MySQL, если только в конфигурационном файле не задано иное. Для таблиц этого типа создан ряд специализированных утилит, позволяющих манипулировать табличными файлами. Сюда входят утилита myisamchk для проверки и восстановления таблиц и утилита myisampack для создания сжатых таблиц.
Таблицы MylSAM являются платформо-независимыми. Табличные файлы можно перемещать между компьютерами разных архитектур и разными операционными системами без всякого преобразования. Для этого MySQL хранит все числа с плавающей запятой в формате IEEE, а все целые числа — в формате с прямым порядком следования байтов. С точки зрения производительности это совершенно непринципиально.
MySQL хранит счетчик подключений к таблице MylSAM. Когда таблица закрывается, счетчик сбрасывается в нуль. Если сервер неожиданно завершает работу, счетчик остается положительным числом. В таком случае в процессе перезапуска сервер обнаружит проблему. Это не означает, что таблица непременно повреждена, но подобная возможность существует. Следует немедленно выполнить инструкцию CHECK TABLE или вызвать утилиту myisamchk. Можно также запустить демон mysql с опцией –myisam-recover, чтобы заставить его восстанавливать все таблицы MyISAM с ненулевым значением счетчика.
Для таблиц MyISAM разрешены одновременные операции вставки и выборки, если только в таблице нет пустых участков. Такие участки создаются инструкциями DELETE и могут быть заполнены последующими инструкциями INSERT. MySQL блокирует таблицу MyISAM, пока инструкция INSERT заполняет пустой участок.
Для автоинкрементных столбцов таблиц MyISAM программа MySQL ведет внутренний счетчик, а не просто добавляет единицу к наибольшему значению столбца. Это дает небольшой выигрыш производительности при операциях вставки, но также означает, что значения столбца никогда не используются повторно. В таблицах других типов при удалении строки с наибольшим значением счетчика и последующей вставке новой строки ей будет присвоен тот же самый идентификатор.
Индексные файлы имеют расширение .MYI. Файлы с расширением .MYD содержат данные, а с расширением .frm – схему таблицы. Если индексный файл по какой-то причине теряется, программа перестраивает индексы, используя информацию из frm-файла.
По умолчанию в каждой таблице может быть не более тридцати двух индексов, но это значение можно повысить до шестидесяти четырех. Индексы создаются в виде двоичных деревьев. Разрешается индексировать столбцы типа BLOB и TEXT, а также столбцы, допускающие значения NULL.
В таблицах MyISAM могут быть фиксированные, динамические либо сжатые записи. Выбор между фиксированным и динамическим форматом диктуется определениями столбцов. Для создания сжатых таблиц предназначена утилита myisampack.
Таблица будет иметь записи фиксированной длины, если в ней нет столбцов типа VARCHAR, BLOB или TEXT. Одинаковая длина записей имеет свои преимущества. Утилите myisampack будет проще восстанавливать поврежденные записи, если она знает их точную длину. Такие записи никогда не приходится разбивать на части при наличии в таблице пустых промежутков, что ускоряет операции чтения. Правда, записи фиксированной длины обычно занимают больше места на диске.
Все записи таблицы будут динамическими, если в ней есть столбцы типа VARCHAR, BLOB или TEXT. Возможно также приведение столбцов типа CHAR к типу VARCHAR, если их длина больше четырех символов. Длина каждой записи отслеживается по специальному заголовку. В нем указана длина текущего сегмента записи. Поскольку при повреждении таблицы связи между фрагментами могут теряться, корректное восстановление записи не всегда возможно.
Динамические записи часто требуют дефрагментации. При их удалении возникают пустые участки, которые не всегда в точности заполняются вставляемыми записями. Более того, из-за операций обновления длина записи может увеличиваться или уменьшаться. Если запись не помещается в отведенном для нее месте, она разбивается на два или более сегмента. По мере распределения записей по файлу время поиска данных возрастает. Устранить фрагментацию можно с помощью инструкции OPTIMIZE TABLES.
Сжатые таблицы занимают гораздо меньше места, чем таблицы с фиксированными или динамическими записями. Их удобно создавать в медленных файловых системах, например в тех, которые используются в компакт-дисках. Каждая запись сжимается отдельно с применением отдельной хэш-таблицы для каждого столбца. Сжатая таблица создается утилитой myisampack. С помощью утилиты myisamchk можно преобразовать сжатую таблицу обратно в фиксированный или динамический формат.
Если таблица MyISAM находится на переполненном диске и в нее добавляется запись, программа MySQL перейдет в бесконечный цикл, ожидая освобождения места на диске.
Столбцы
В табл. 6.1 указаны размерности стандартных типов данных MySQL. Значения некоторых типов всегда занимают фиксированный объем памяти. Например, размерность столбцов типа INTEGER всегда составляет 4 байта. Столбцы типа CHAR могут иметь размерность от 0 до 255, но в момент создания таблицы под них отводится фиксированный объем памяти. Существуют также столбцы переменной размерности. Например, столбцы типа VARCHAR и BLOB интерпретируются в соответствии с их содержимым.
Как указывалось выше, таблицы MYISAM содержат записи фиксированной либо переменной длины. Переход во второй режим осуществляется при наличии столбцов переменной размерности.
Значения столбцов типа DECIMAL и NUMERIC хранятся в строковом виде, что позволяет обеспечить точность представления десятичных чисел. Каждой цифре соответствует один символ, еще по одному символу отводится на знаковый разряд и десятичную точку.