Утилита myisampack используется для сжатия таблиц MyISAM, а утилита pack_isam — для сжатия таблиц ISAM. Поскольку таблицы ISAM являются устаревшими, здесь будет рассматриваться только myisampack.
myisampack сжимает каждый столбец в таблице по отдельности. Информация, необходимая для декомпрессии столбцов, считывается в память при открытии таблицы. В результате обеспечивается более высокая производительность при доступе к отдельным записям, поскольку нужно распаковывать только одну запись, а не значительно больший по размеру дисковый блок, как при использовании программы Stacker в MS DOS. В среднем myisampack сжимает файл данных на 40%-70%.
MySQL использует отображение в памяти (mmap()) для сжатых таблиц, а если mmap() не работает, возвращается назад к нормальному режиму чтения/записи.
Обратите внимание на следующее:
После сжатия таблица доступна в режиме только для чтения. Это удобно, скажем, для записи на CD.
myisampack может также сжимать столбцы c типами BLOB или TEXT.
Утилиту myisampack можно запустить следующим образом:
shell> myisampack [options] filename ...
Каждое имя файла (filename) должно быть именем индексного файла (.MYI). Если вы не находитесь в директории базы данных, необходимо указать полный путь к файлу. Допускается опускать расширение .MYI.
myisampack поддерживает следующие опции:
-b, -backup
Создает резервную копию таблицы, присваивая ей имя tbl_name.OLD
-#, -debug=debug_options
Выводить журнал отладки. Строка debug_options часто принимает значение d:t:o,filename
-f, -force
Сжатие таблицы происходит, даже если она увеличивается или если существует временный файл. Во время сжатия таблицы myisampack создает временный файл tbl_name.TMD. Если вы вручную прекратите выполнение myisampack, может оказаться, что файл tbl_name.TMD не будет удален. Обычно если myisampack обнаруживает существующий tbl_name.TMD, она прекращает работу и выдает ошибку. При указании опции -force myisampack сжимает таблицу в любом случае
-j big_tbl_name, -join=big_tbl_name
Соединяет все таблицы, указанные в командной строке, в одну таблицу big_tbl_name. Все таблицы, подлежащие объединению, должны быть идентичными (одинаковые имена и типы столбцов, одинаковые индексы и т.д.)
-p #, -packlength=#
Определяет разрядность поля, хранящего длину строки, в байтах. Может принимать значения 1, 2 или 3. (myisampack хранит все строки с указателями длины размером в 1, 2, или 3 байта. В большинстве случаев myisampack способна определить правильное значение длины перед началом сжатия файла, но во время сжатия она может обнаружить, что может быть использована более короткая длина. В этом случае myisampack выведет сообщение о том, что в следующий раз при сжатии данного файла можно использовать более короткую длину записи.)
-s, -silent
Молчаливый режим. Сообщения выводятся только при возникновении ошибок
-t, -test
Сжатие таблицы не выполняется, происходит только проверка процедуры сжатия
-T dir_name, -tmp_dir=dir_name
Указанная директория используется как местоположение для создания временной таблицы
-w, -wait
Если таблица уже используется, подождать повторить попытку. Если сервер mysqld был вызван с опцией -skip-external-locking, то не самая лучшая идея — вызывать myisampack, если таблица может модифицироваться во время процесса сжатия
Последовательность приведенных ниже команд иллюстрирует типичный сеанс сжатия таблицы:
shell> ls -l station.*-rw-rw-r-- 1 monty my 994128 Apr 17 19:00 station.MYD-rw-rw-r-- 1 monty my 53248 Apr 17 19:00 station.MYI-rw-rw-r-- 1 monty my 5767 Apr 17 19:00 station.frm shell> myisamchk -dvv station MyISAM file: stationIsam-version: 2Creation time: 1996-03-13 10:08:58Recover time: 1997-02-02 3:06:43Data records: 1192 Deleted blocks: 0Datafile: Parts: 1192 Deleted data: 0Datafile pointer (bytes): 2 Keyfile pointer (bytes): 2Max datafile length: 54657023 Max keyfile length: 33554431Recordlength: 834Record format: Fixed length table description:Key Start Len Index Type Root Blocksize Rec/key1 2 4 unique unsigned long 1024 1024 12 32 30 multip. text 10240 1024 1 Field Start Length Type1 1 12 2 4 ... ... ... ...... ... ... ... 56 827 457 831 4 shell> myisampack station.MYICompressing station.MYI: (1192 records)- Calculating statistics normal: 20 empty-space: 16 empty-zero: 12 empty-fill: 11pre-space: 0 end-space: 12 table-lookups: 5 zero: 7Original trees: 57 After join: 17- Compressing file87.14% shell> ls -l station.*-rw-rw-r-- 1 monty my 127874 Apr 17 19:00 station.MYD-rw-rw-r-- 1 monty my 55296 Apr 17 19:04 station.MYI-rw-rw-r-- 1 monty my 5767 Apr 17 19:00 station.frm shell> myisamchk -dvv station MyISAM file: stationIsam-version: 2Creation time: 1996-03-13 10:08:58Recover time: 1997-04-17 19:04:26Data records: 1192 Deleted blocks: 0Datafile: Parts: 1192 Deleted data: 0Datafilepointer (bytes): 3 Keyfile pointer (bytes): 1Max datafile length: 16777215 Max keyfile length: 131071Recordlength: 834Record format: Compressed table description:Key Start Len Index Type Root Blocksize Rec/key1 2 4 unique unsigned long 10240 1024 12 32 30 multip. text 54272 1024 1 Field Start Length Type Huff tree Bits1 1 1 constant 1 02 2 4 zerofill(1) 2 93 6 4 no zeros, zerofill(1) 2 94 10 1 3 95 11 20 table-lookup 4 06 31 1 3 97 32 30 no endspace, not_always 5 9 ... ... ... ...... ... ... ... 53 805 1 17 154 806 1 3 955 807 20 no empty 3 956 827 4 no zeros, zerofill(2) 2 957 831 4 no zeros, zerofill(1) 2 9
Листинг 5.1. (html, txt)
Ниже приведено описание вывода myisampack:
normal
Количество столбцов, для которых не используется никакого дополнительного сжатия
empty-space
Количество столбцов, содержащих пустые значения; они занимают по 1 биту
empty-zero
Количество целочисленных столбцов, в которых содержатся только двоичные нули (ascii 0); каждый из них будет занимать 1 бит
empty-fill
Количество целочисленных столбцов, значения которых не полностью занимают отведенную для них разрядность в байтах; тип этих столбцов изменяется на тип с меньшей разрядностью (например, столбец INTEGER может быть изменен на MEDIUMINT)
pre-space
Количество десятичных столбцов, которые хранятся с начальными пробелами. В этом случае каждое значение будет содержать число ведущих пробелов
end-space
Количество столбцов, имеющих много оконечных пробелов. В этом случае каждое значение будет содержать число таких пробелов
table-lookup
Столбец имеет только небольшое количество различающихся значений, которые перед сжатием Хаффмана (Huffman) конвертируются в ENUM
zero
Количество столбцов, все значения которых являются нулями
Original trees
Начальное количество деревьев Хаффмана
After join
Количество различных деревьев Хаффмана, оставленных после соединения деревьев для сохранения небольшого пространства в заголовках
После сжатия таблицы myisamchk -dvv выводит дополнительную информацию по каждому полю.
Type
Тип поля может содержать следующие дескрипторы:
constant
Все строки содержат одинаковое значение
no endspace
Не сохраняются замыкающие пробелы
no endspace, not_always
Не сохраняются замыкающие пробелы и не производится сжатие за счет замыкающих пробелов для всех значений
no endspace, no empty
Не сохраняются замыкающие пробелы. Не сохраняются пустые значения
table-lookup
Столбец был преобразован к ENUM
zerofill(n)
В значении n главных байтов всегда являются 0 и не сохранены.
no zeros
Не сохраняются нули.
always zero
Значения 0 хранятся в 1 бите.
Huff tree
Дерево Хаффмана, связанное с полем.
Bits
Количество битов, используемых в дереве Хаффмана.
После запуска pack_isam/myisampack нужно запустить isamchk/myisamchk для повторного создания индекса. В это время можно также отсортировать индексные блоки и создать статистику, необходимую для более эффективной работы оптимизатора MySQL:
После установки сжатой таблицы в директорию базы данных MySQL нужно проделать операцию mysqladmin flush-tables, чтобы сервер mysqld начал использовать новую таблицу.
Для распаковки сжатой таблицы можно использовать опцию -unpack isamchk или myisamchk.