| |
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
будут
автоматически проверены и восстановлены при открытии, если таблицы не были
закрыты правильно.
AUTO_INCREMENT
.
MyISAM
автоматически модифицирует его на операциях
INSERT/UPDATE
. Значение AUTO_INCREMENT
может быть
сброшено с помощью myisamchk
. Это делает столбцы
AUTO_INCREMENT
быстрее (по крайней мере на 10%), а старые числа
не будет многократно использоваться, как это было со старым
ISAM
. Обратите внимание, что когда AUTO_INCREMENT
определен на конце ключа из нескольких частей, работает старое поведение.
AUTO_INCREMENT
), дерево ключей будет
поделено так, чтобы высокий узел содержал только один ключ. Это улучшит
использование места в дереве ключей.
BLOB
и TEXT
теперь могут
быть корректно индексированы.
NULL
позволяются в индексированных столбцах. Это
занимает 0-1 байт на ключ.
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, из
каталогов баз данных.
MySQL может поддерживать различные индексные типы, но нормальный тип ISAM
или MyISAM. Они используют индекс B-дерева, и Вы можете грубо вычислять
размер для индексного файла как (key_length+4)/0.67
. Это для
самого плохого случая, когда все ключи вставлены в сортируемом порядке, и мы
не имеем сжатых ключей.
Индексы строк сжимаются. Если первая индексная часть представляет собой
строку, она также будет префиксно сжата. Сжатие делает индексный файл меньше,
чем вышеупомянутые объекты, если столбец строки имеет много конечных пробелов
или столбец типа VARCHAR
, который не всегда используется для
данных полной длины. Префиксное сжатие используется на ключах, которые
начинаются со строки. Префиксное сжатие хорошо помогает, если имеется много
строк с идентичным префиксом.
В таблицах MyISAM
Вы можете также сжимать числа, определяя
PACK_KEYS=1
, когда Вы создаете таблицу. Это помогает, когда Вы
имеете много целочисленных ключей, которые имеют идентичный префикс, когда
числа сохранены в формате со старшим байтом в начале.
MyISAM поддерживает 3 различных типа таблиц. Два из них
будут выбраны автоматически в зависимости от типа столбцов, которые Вы
используете. Третий тип, сжатые таблицы, может быть создан только с помощью
внешнего инструмента myisampack
.
Это заданный по умолчанию формат. Он используется, когда таблица не
содержит столбцов типов VARCHAR
, BLOB
или
TEXT
.
Этот формат самый простой и наиболее безопасный. Он также самый быстрый из дисковых форматов. Быстродействие исходит из простого пути, которым данные могут быть найдены на диске. При поиске чего-либо с индексом и статическим форматом это очень просто. Только умножите номер строки на длину строки.
Также при просмотре таблицы очень просто читать постоянное число записей за каждую дисковую операцию чтения.
Кроме того, myisamchk
обычно может исправлять все записи за
исключением частично записанных. Обратите внимание, что в MySQL все индексы
могут всегда восстанавливаться.
CHAR
, NUMERIC
и DECIMAL
столбцы дополняются пробелами до ширины столбца.
myisamchk
, если огромное число
записей не удалено, и Вы хотите возвращать свободное дисковое пространство
операционной системе.
Этот формат используется, если таблица содержит столбцы типов
VARCHAR
, BLOB
или TEXT
, или если
таблица была создана с опцией ROW_FORMAT=dynamic
.
Этот формат немного сложнее потому, что каждая строка должна иметь заголовок, указывающий ее длину. Одна запись может также заканчиваться не в одном месте, когда она удлиннилась при обновлении.
Вы можете использовать OPTIMIZE table
или myisamchk
для дефрагментации таблицы. Если Вы имеете
статические данные, к которым часто обращаетесь или меняете их, неплохо бы
переместить эти динамические столбцы (например, VARCHAR
или
BLOB
) в другие таблицы, чтобы избежать фрагментации:
''
) для строковых столбцов или равными нулю для
числовых столбцов (это не столбцы, содержащие значения 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
.Этот тип таблиц предназначен только для чтения, он может быть сгенерирован
инструментом myisampack
(pack_isam
для таблиц типа
ISAM
):
myisampack
.
0
будут сохранены, используя 1 бит.
BIGINT
(8 байт) может быть сохранен как столбец
TINYINT
(1 байт), если все значения находятся в диапазоне от
0
до 255
.
ENUM
.
BLOB
или TEXT
.
myisamchk
.Формат файла, который использует MySQL, чтобы хранить данные, был многократно тщательно проверен, но всегда найдутся обстоятельства, которые могут разрушить таблицы базы данных.
Несмотря на то, что формат таблиц MyISAM очень надежен (все изменения для таблицы будут записаны перед возвратами инструкций SQL), Вы можете получать разрушенные таблицы, если случаются некоторые из следующих вещей:
mysqld
рухнул посреди записи.
Типичные признаки для разрушенной таблицы:
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
, значит, разрушался и был перезапущен
автоматически. Если это не имеет место, значит, что-то не так с сервером.
Каждый MyISAM
-файл .MYI
имеет в заголовке
счетчик, который может использоваться, чтобы проверить, была ли таблица
закрыта правильно.
Если Вы получаете следующее предупреждение из CHECK TABLE
или
myisamchk
:
# clients is using or hasn't closed the table properly
Это означает, что этот счетчик вышел из синхронизации. Это пока еще не означает, что таблица разрушена, но Вы должны по крайней мере сделать проверку таблицы, чтобы удостовериться, что она в порядке.
Счетчик работает следующим образом:
FLUSH
или
потому, что не имеется участка памяти в кэше таблицы) счетчик уменьшается,
если таблица модифицировалась в любом месте.
Другими словами, единственные пути, которыми он может выйти из синхронизации такие:
MyISAM
-таблицы скопированы без LOCK
и
FLUSH TABLES
.
myisamchk --repair
или myisamchk
--update-state
на таблица, которая была в использовании у
mysqld
.
mysqld
используют таблицу, и каждый сделал
REPAIR
или CHECK
, в то время как таблица
использовалась другим сервером. В этой ситуации команда CHECK
безопасна (даже если Вы получите предупреждение с других серверов), но вот
REPAIR
нужно избегать, поскольку это в настоящее время заменяет
файл данных на новый, который не будет передан на другие серверы.
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |