Утилита myisampack
используется для сжатия таблиц
MyISAM, а утилита
pack_isam - для сжатия таблиц
ISAM. Поскольку таблицы
ISAM являются устаревшими,
здесь будет рассматриваться
только myisampack, но все,
сказанное относительно
myisampack, справедливо также
и для pack_isam.
myisampack сжимает каждый
столбец в таблице по отдельности.
Информация, необходимая для
декомпрессии столбцов,
считывается в память при открытии
таблицы. В результате
обеспечивается более высокая
производительность при доступе к
отдельным записям, поскольку нужно
распаковывать только одну запись,
а не значительно больший по
размеру дисковый блок, как при
использовании программы Stacker в MS DOS.
В среднем myisampack сжимает
файл данных на 40%-70%.
(MySQL использует отображение в
памяти (mmap()) для сжатых
таблиц
а если mmap() не работает,
возвращается назад к нормальному
режиму чтения/записи.
Обратите внимание на следующее:
После сжатия таблица доступна в режиме только для чтения. Это удобно, скажем, для записи на CD. Реализация возможности записи в сжатые таблицы находится в нашем списке задач к выполнению, но имеет низкий приоритет.
myisampack может также
сжимать столбцы c типами
BLOB или TEXT. В
предыдущей версии
pack_isam (для таблиц
ISAM) данной функции не
было.
Утилиту 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
сжимает таблицу в любом случае.
-?, --help
Выдает справочную информацию и завершает работу.
-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
Указанная директория используется как местоположение для создания временной таблицы.
-v, --verbose
Расширенный режим вывода сообщений. Выводится информация о состоянии процесса и результаты сжатия.
-V, --version
Отображает информацию о версии и завершает работу.
-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 stationMyISAM file: station Isam-version: 2 Creation time: 1996-03-13 10:08:58 Recover time: 1997-02-02 3:06:43 Data records: 1192 Deleted blocks: 0 Datafile: Parts: 1192 Deleted data: 0 Datafile pointer (bytes): 2 Keyfile pointer (bytes): 2 Max datafile length: 54657023 Max keyfile length: 33554431 Recordlength: 834 Record format: Fixed length table description: Key Start Len Index Type Root Blocksize Rec/key 1 2 4 unique unsigned long 1024 1024 1 2 32 30 multip. text 10240 1024 1 Field Start Length Type 1 1 1 2 2 4 3 6 4 4 10 1 5 11 20 6 31 1 7 32 30 8 62 35 9 97 35 10 132 35 11 167 4 12 171 16 13 187 35 14 222 4 15 226 16 16 242 20 17 262 20 18 282 20 19 302 30 20 332 4 21 336 4 22 340 1 23 341 8 24 349 8 25 357 8 26 365 2 27 367 2 28 369 4 29 373 4 30 377 1 31 378 2 32 380 8 33 388 4 34 392 4 35 396 4 36 400 4 37 404 1 38 405 4 39 409 4 40 413 4 41 417 4 42 421 4 43 425 4 44 429 20 45 449 30 46 479 1 47 480 1 48 481 79 49 560 79 50 639 79 51 718 79 52 797 8 53 805 1 54 806 1 55 807 20 56 827 4 57 831 4 shell>myisampack station.MYICompressing station.MYI: (1192 records) - Calculating statistics normal: 20 empty-space: 16 empty-zero: 12 empty-fill: 11 pre-space: 0 end-space: 12 table-lookups: 5 zero: 7 Original trees: 57 After join: 17 - Compressing file 87.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 stationMyISAM file: station Isam-version: 2 Creation time: 1996-03-13 10:08:58 Recover time: 1997-04-17 19:04:26 Data records: 1192 Deleted blocks: 0 Datafile: Parts: 1192 Deleted data: 0 Datafilepointer (bytes): 3 Keyfile pointer (bytes): 1 Max datafile length: 16777215 Max keyfile length: 131071 Recordlength: 834 Record format: Compressed table description: Key Start Len Index Type Root Blocksize Rec/key 1 2 4 unique unsigned long 10240 1024 1 2 32 30 multip. text 54272 1024 1 Field Start Length Type Huff tree Bits 1 1 1 constant 1 0 2 2 4 zerofill(1) 2 9 3 6 4 no zeros, zerofill(1) 2 9 4 10 1 3 9 5 11 20 table-lookup 4 0 6 31 1 3 9 7 32 30 no endspace, not_always 5 9 8 62 35 no endspace, not_always, no empty 6 9 9 97 35 no empty 7 9 10 132 35 no endspace, not_always, no empty 6 9 11 167 4 zerofill(1) 2 9 12 171 16 no endspace, not_always, no empty 5 9 13 187 35 no endspace, not_always, no empty 6 9 14 222 4 zerofill(1) 2 9 15 226 16 no endspace, not_always, no empty 5 9 16 242 20 no endspace, not_always 8 9 17 262 20 no endspace, no empty 8 9 18 282 20 no endspace, no empty 5 9 19 302 30 no endspace, no empty 6 9 20 332 4 always zero 2 9 21 336 4 always zero 2 9 22 340 1 3 9 23 341 8 table-lookup 9 0 24 349 8 table-lookup 10 0 25 357 8 always zero 2 9 26 365 2 2 9 27 367 2 no zeros, zerofill(1) 2 9 28 369 4 no zeros, zerofill(1) 2 9 29 373 4 table-lookup 11 0 30 377 1 3 9 31 378 2 no zeros, zerofill(1) 2 9 32 380 8 no zeros 2 9 33 388 4 always zero 2 9 34 392 4 table-lookup 12 0 35 396 4 no zeros, zerofill(1) 13 9 36 400 4 no zeros, zerofill(1) 2 9 37 404 1 2 9 38 405 4 no zeros 2 9 39 409 4 always zero 2 9 40 413 4 no zeros 2 9 41 417 4 always zero 2 9 42 421 4 no zeros 2 9 43 425 4 always zero 2 9 44 429 20 no empty 3 9 45 449 30 no empty 3 9 46 479 1 14 4 47 480 1 14 4 48 481 79 no endspace, no empty 15 9 49 560 79 no empty 2 9 50 639 79 no empty 2 9 51 718 79 no endspace 16 9 52 797 8 no empty 2 9 53 805 1 17 1 54 806 1 3 9 55 807 20 no empty 3 9 56 827 4 no zeros, zerofill(2) 2 9 57 831 4 no zeros, zerofill(1) 2 9
Ниже приведено описание вывода 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:
myisamchk -rq --analyze --sort-index table_name.MYI isamchk -rq --analyze --sort-index table_name.ISM
После установки сжатой таблицы в
директорию базы данных MySQL нужно
проделать операцию mysqladmin
flush-tables, чтобы сервер
mysqld начал использовать
новую таблицу.
Для распаковки сжатой таблицы
можно использовать опцию
--unpack isamchk или
myisamchk.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.
© 1995-2005 MySQL AB. All rights reserved.
