6.6.6 myisampack — Генерация сжатых, только для чтения таблиц MyISAM
Утилита myisampack сжимает MyISAM таблицы. myisampack работает, сжимая каждый столбец в таблице по отдельности. Обычно myisampack сжимает файл данных на 40–70%.
При последующем использовании таблицы сервер загружает в память информацию, необходимую для разархивирования столбцов. Это приводит к значительно лучшему быстродействию при обращении к отдельным строкам, поскольку нужно разархивировать только одну строку.
MySQL использует mmap(), когда это возможно, для выполнения отображения памяти на сжатых таблицах. Если mmap() не работает, MySQL переходит к обычным операциям чтения/записи файлов.
Обратите внимание на следующее:
Если сервер mysqld был вызван с отключенной внешней блокировкой, не рекомендуется вызывать myisampack, если таблица может быть обновлена сервером во время процесса архивации. Безопаснее всего сжимать таблицы, когда сервер остановлен.
После архивации таблица становится только для чтения. Это обычно предполагается (например, при доступе к сжатым таблицам на компакт-диске).
myisampack не поддерживает разделяемые таблицы.
Вызов myisampack выглядит так:
myisampack [options] file_name ...
Каждое имя файла должно быть именем файла индекса (.MYI). Если вы находитесь не в каталоге базы данных, укажите полное имя файла. Разрешается опустить расширение .MYI.
После сжатия таблицы с помощью myisampack, используйте myisamchk -rq для перестроения индексов. Раздел 6.6.4, «myisamchk — Утилита обслуживания таблиц MyISAM».
myisampack поддерживает следующие опции. Также он читает файлы параметров и поддерживает опции для обработки, описанные в Разделе 6.2.2.3, «Параметры командной строки, влияющие на обработку файлов параметров».
END_OF_DOCUMENT_MARKER-
--help,-?Формат командной строки --helpВывести сообщение о справке и завершить работу.
-
--backup,-bФормат командной строки --backupСоздать резервную копию файла данных каждой таблицы, используя имя
.tbl_name.OLD -
Формат командной строки --character-sets-dir=dir_nameТип Имя каталога Каталог, где установлены кодировки символов. См. Раздел 12.15, «Настройка кодировки символов».
-
--debug[=,debug_options]-# [debug_options]Формат командной строки --debug[=debug_options]Тип Строка Значение по умолчанию d:t:oЗаписать лог отладки. Типичная строка
debug_options— этоd:t:o,. Значение по умолчанию —file_named:t:o.Эта опция доступна только в том случае, если MySQL был собран с использованием
WITH_DEBUG. Релизные бинарные файлы MySQL, предоставляемые Oracle, не собираются с использованием этой опции. -
--force,-fФормат командной строки --forceСоздать упакованную таблицу, даже если она станет больше оригинала или если промежуточный файл из предыдущего вызова myisampack существует. (myisampack создает промежуточный файл с именем
в каталоге базы данных во время сжатия таблицы. Если вы завершите работу myisampack, файлtbl_name.TMD.TMDможет не быть удален.) Обычно myisampack завершается с ошибкой, если обнаруживает, чтосуществует. С помощьюtbl_name.TMD--force, myisampack упаковывает таблицу в любом случае. -
--join=,big_tbl_name-jbig_tbl_nameФормат командной строки --join=big_tbl_nameТип Строка Объединить все таблицы, указанные в командной строке, в одну упакованную таблицу
big_tbl_name. Все таблицы, которые должны быть объединены, должны иметь одинаковую структуру (одинаковые имена и типы столбцов, одинаковые индексы и т. д.).big_tbl_nameне должно существовать до операции объединения. Все исходные таблицы, указанные в командной строке, которые должны быть объединены вbig_tbl_name, должны существовать. Исходные таблицы считываются для операции объединения, но не изменяются. -
--silent,-sФормат командной строки --silentРежим без вывода сообщений. Выводить сообщения только при возникновении ошибок.
-
--test,-tФормат командной строки --testНе упаковывать таблицу, а только проверить возможность упаковки.
-
--tmpdir=,dir_name-Tdir_nameФормат командной строки --tmpdir=dir_nameТип Имя каталога Использовать указанный каталог в качестве местоположения, где myisampack создает временные файлы.
-
--verbose,-vФормат командной строки --verboseПодробный режим. Выводить информацию о ходе операции упаковки и ее результате.
-
--version,-VФормат командной строки --versionВывести информацию о версии и завершить работу.
-
--wait,-wФормат командной строки --waitОжидать и повторять попытку, если таблица используется. Если сервер mysqld был запущен с отключенной внешней блокировкой, не рекомендуется вызывать myisampack, если таблица может обновляться сервером во время процесса упаковки.
Следующая последовательность команд иллюстрирует типичный сеанс сжатия таблицы:
$> ls -l station.*
-rw-rw-r-- 1 jones my 994128 Apr 17 19:00 station.MYD
-rw-rw-r-- 1 jones my 53248 Apr 17 19:00 station.MYI
$> myisamchk -dvv station
MyISAM 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
$> myisampack station.MYI
Compressing 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%
Remember to run myisamchk -rq on compressed tables
$> myisamchk -rq station
- check record delete-chain
- recovering (with sort) MyISAM-table 'station'
Data records: 1192
- Fixing index 1
- Fixing index 2
$> mysqladmin -uroot flush-tables
$> ls -l station.*
-rw-rw-r-- 1 jones my 127874 Apr 17 19:00 station.MYD
-rw-rw-r-- 1 jones my 55296 Apr 17 19:04 station.MYI
$> myisamchk -dvv station
MyISAM 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
Datafile pointer (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Количество столбцов, содержащих значения, которые являются только пробелами. Они занимают один бит.
-
empty-zeroКоличество столбцов, содержащих значения, которые являются только двоичными нулями. Они занимают один бит.
-
empty-fillКоличество столбцов целых чисел, которые не занимают весь диапазон байтов своего типа. Они изменяются на меньший тип. Например, столбец
BIGINT(восемь байтов) может храниться как столбецTINYINT(один байт), если все его значения находятся в диапазоне от-128до127. -
pre-spaceКоличество десятичных столбцов, которые хранятся с ведущими пробелами. В этом случае каждое значение содержит счетчик количества ведущих пробелов.
-
end-spaceКоличество столбцов, имеющих много завершающих пробелов. В этом случае каждое значение содержит счетчик количества завершающих пробелов.
-
table-lookupСтолбец имел только небольшое количество различных значений, которые были преобразованы в
ENUMперед сжатием Хаффмана. -
zeroКоличество столбцов, для которых все значения равны нулю.
-
Original treesНачальное количество деревьев Хаффмана.
-
After joinКоличество различных деревьев Хаффмана, оставшихся после объединения деревьев для экономии места в заголовке.
После сжатия таблицы строки Field, отображаемые 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Нулевые значения хранятся с использованием одного бита.
-
-
Huff treeНомер дерева Хаффмана, связанного со столбцом.
-
BitsКоличество бит, используемых в дереве Хаффмана.
После запуска myisampack, используйте myisamchk для повторного создания индексов. В это время вы также можете отсортировать блоки индексов и создать статистику, необходимую для более эффективной работы оптимизатора MySQL:
myisamchk -rq --sort-index --analyze tbl_name.MYI
После установки сжатой таблицы в каталог базы данных MySQL, выполните mysqladmin flush-tables для принудительного использования новой таблицы mysqld.
Для распаковки сжатой таблицы используйте опцию --unpack утилиты myisamchk.
© 2025 Oracle
Licensed under the GPLv2 License.