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--forcemyisampack упаковывает таблицу независимо. -
--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.