4.6.5 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 для перестроения индексов. Раздел 4.6.3, «myisamchk — Утилита обслуживания таблиц MyISAM».
myisampack поддерживает следующие параметры. Также он читает файлы параметров и поддерживает параметры для их обработки, описанные в Разделе 4.2.2.3, «Параметры командной строки, влияющие на обработку файла параметров».
END_OF_DOCUMENT_MARKER-
--help,-?Формат командной строки --helpОтобразить сообщение справки и выйти.
-
--backup,-bФормат командной строки --backupСоздать резервную копию файла данных каждой таблицы с использованием имени
.tbl_name.OLD -
Формат командной строки --character-sets-dir=dir_nameТип Имя каталога Каталог, в котором установлены наборы символов. См. Раздел 10.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
-rw-rw-r-- 1 jones my 5767 Apr 17 19:00 station.frm
$> 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
-rw-rw-r-- 1 jones my 5767 Apr 17 19:00 station.frm
$> 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.