Spec-Zone.ru › MySQL 8.4

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

    Формат командной строки --character-sets-dir=dir_name
    Тип Имя каталога

    Каталог, в котором установлены наборы символов. См. Раздел 12.15, «Настройка наборов символов».

  • --debug[=debug_options], -# [debug_options]

    Формат командной строки --debug[=debug_options]
    Тип Строка
    Значение по умолчанию d:t:o

    Записать отладочный журнал. Типичная строка debug_options — это d:t:o,file_name. По умолчанию — d:t:o.

    Этот параметр доступен только в том случае, если MySQL был скомпилирован с помощью WITH_DEBUG. Бинарные файлы релизов MySQL, предоставляемые компанией Oracle, не скомпилированы с этим параметром.

  • --force, -f

    Формат командной строки --force

    Сгенерировать упакованную таблицу, даже если она станет больше исходной или если промежуточный файл от предыдущего вызова myisampack существует. (myisampack создаёт временный файл, имя которого — tbl_name.TMD, в каталоге базы данных при сжатии таблицы. Если вы прервете выполнение myisampack, файл .TMD может не быть удалён.) Обычно myisampack завершается с ошибкой, если обнаруживает, что tbl_name.TMD существует. С параметром --force myisampack упаковывает таблицу независимо.

  • --join=big_tbl_name, -j big_tbl_name

    Формат командной строки --join=big_tbl_name
    Тип Строка

    Объединить все таблицы, указанные в командной строке, в одну упакованную таблицу big_tbl_name. Все таблицы, которые нужно объединить, должны иметь одинаковую структуру (одинаковые имена и типы столбцов, одинаковые индексы и так далее).

    big_tbl_name не должно существовать до операции объединения. Все исходные таблицы, указанные в командной строке для объединения в big_tbl_name, должны существовать. Исходные таблицы считываются для операции объединения, но не изменяются.

  • --silent, -s

    Формат командной строки --silent

    Режим без вывода. Выводить данные только при возникновении ошибок.

  • --test, -t

    Формат командной строки --test

    Не выполнять фактическую упаковку таблицы, а только проверить её упаковку.

  • --tmpdir=dir_name, -T dir_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.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/myisampack.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API