# Главная
# О библиотеке

# Выбор дистрибутива
преимущества Linux/UNIX | основные дистрибутивы | серверный Linux | BSD | LiveCDs | прочее

# Установка и удаление программ
общие вопросы | каталоги софта | специальные случаи

# Настройка и работа
установка, загрузчики | настройка Linux | консоль | файловые системы | процессы | шеллы, русификация, коммандеры | виртуальные машины, эмуляторы

# X Window и оконные менеджеры
настройка X Window | GNOME | KDE | IceWM и др.

# Работа с текстами
редакторы | офис | шрифты, кодировки и русификация | преобразования текстовых файлов | LaTeX, SGML и др. | словари

# Графика
GIMP | фото | обработка изображений | форматы графических файлов

# Сети, администрирование
общие вопросы | Dialup & PPP | брандмауэры | маршрутизация | работа в Windows-сетях | веб-серверы | Apache | прокси-серверы | сетевая печать | прочее

# Программирование
GCC & GNU make | программирование в UNIX | графические библиотеки | Tcl | Perl | PHP | Java & C# | СУБД | CVS | прочее

# Ядро
# Мультимедиа
# Интернет
# Почта
# Безопасность
# Железо
# Разное

# Linux HowTo (как сделать)
# Книги и руководства
# Материалы на английском языке


MySQL The World's Most Popular Open Source Database # Online shop | Site map |  
CompanyProductsSupport & ConsultingTraining & CertificationDownloadsDocumentation
  BooksArticlesMailing ListsPresentationsOther Sites  
Search the MySQL manual:
MySQL Manual
  • 7 Типы таблиц MySQL
    • 7.1 Таблицы MyISAM
    • 7.2 Таблицы MERGE
    • 7.3 Таблицы ISAM
    • 7.4 Таблицы HEAP
    • 7.5 Таблицы InnoDB
    • 7.6 Таблицы BDB или Berkeley_DB

Buy this Reference Manual in softcover from Barnes & Noble!

MySQL Reference Manual
Previous / Next / Up / Table of Contents

7.4 Таблицы HEAP

Для HEAP-таблиц используются хэш-индексы; эти таблицы хранятся в памяти. Благодаря этому обработка их осуществляется очень быстро, однако в случае сбоя MySQL будут утрачены все данные, которые в них хранились. Тип HEAP очень хорошо подходит для временных таблиц!

Для внутренних HEAP-таблиц в MySQL используется 100%-ное динамическое хэширование без областей переполнения; дополнительное пространство для свободных списков не требуется. Отсутствуют при использовании HEAP-таблиц и проблемы с командами удаления и вставки, которые часто применяются в хэшированных таблицах:

mysql> CREATE TABLE test TYPE=HEAP SELECT ip,SUM(downloads) AS down
    -> FROM log_table GROUP BY ip;
mysql> SELECT COUNT(ip),AVG(down) FROM test;
mysql> DROP TABLE test;

При использовании HEAP-таблиц необходимо обращать внимание на следующие моменты:

  • Необходимо всегда указывать параметр MAX_ROWS в операторе CREATE, чтобы случайным образом не занять всю память.
  • Индексы будут использоваться только с = и <=> (но ОЧЕНЬ быстрые).
  • В HEAP-таблицах для поиска строки могут использоваться только полные ключи, в то время как для таблиц MyISAM при поиске строк может применяться любой префикс ключа.
  • Для HEAP-таблиц используется формат с фиксированной длиной записи.
  • Для HEAP-таблиц не поддерживаются столбцы формата BLOB/TEXT.
  • Для HEAP-таблиц не поддерживаются столбцы формата AUTO_INCREMENT.
  • Для HEAP-таблиц не поддерживаются индексы в столбцах формата NULL.
  • В HEAP-таблицах могут встречаться совпадающие ключи (что не является нормой для хэшированных таблиц).
  • HEAP-таблицы используются совместно всеми клиентами (как и все другие таблицы).
  • Нельзя производить поиск следующей записи в порядке следования (т.е. использовать индекс в команде ORDER BY).
  • Данные HEAP-таблиц расположены в маленьких блоках. Таблицы на 100% являются динамическими (при вставке). Нет необходимости ни в областях переполнения, ни в дополнительных ключах. Удаленные строки помещаются в связанный список и используются при вставке в таблицу новых данных.
  • Следует позаботиться о том, чтобы имелось достаточное количество дополнительной памяти для всех HEAP-таблиц, которые будут использоваться одновременно,.
  • Чтобы освободить память, необходимо запустить команду DELETE FROM heap_table, TRUNCATE heap_table или DROP TABLE heap_table.
  • MySQL не может подсчитать, сколько строк находится между двумя значениями (используется оптимизатором диапазонов для выбора используемого индекса). Это может повлиять на некоторые запросы, если преобразовать таблицу MyISAM в формат HEAP.
  • При создании размер таблицы HEAP не может превышать max_heap_table_size; это сделано для того, чтобы обеспечить защиту от случайных неквалифицированных действий.

Количество памяти, необходимой для одной строки в HEAP-таблице, вычисляется следующим образом:

SUM_OVER_ALL_KEYS(max_length_of_key + sizeof(char*) * 2)
+ ALIGN(length_of_row+1, sizeof(char*))

sizeof(char*) составляет 4 на 32-разрядных компьютерах и 8 - на 64-разрядных.

User Comments

Posted by John Lim on Friday May 17 2002, @6:24am[Delete] [Edit]

I have benchmarked inserts and deletes on MyISAM
and HEAP tables. HEAP tables appear to be at
least 30% faster on inserts but only 15% faster
when selecting single records. MyISAM table
caching is pretty fast. I also did some
benchmarks on Oracle for comparison. See
http://php.weblogs.com/oracle_mysql_performance
for further details.

Posted by Kenneth Winne on Friday May 17 2002, @6:24am[Delete] [Edit]

It there a 4Gb limit for Heap tables? I have set
max_heap_table_size=8000M, but the load fails at
4Gb. Any help is greatly appreciated!

Posted by Anton Shafarenko on Friday May 17 2002, @6:24am[Delete] [Edit]

You can't have a HEAP bigger than 4Gb for the very simple reason that this is the limit of a 32 bit machine's
address space. In fact, a heap that takes up any significant amount of your RAM is generally a bad idea, as
this will result in it getting swapped to disk which basically makes it like a MyISAM table, only worse
because the way it'll be stored will be optimised for RAM storage, not hard disk storage.

Granted on most modern x86 CPU's at least there's support for extending the addressable memory to
64MB, though that still doesnt change the fact that the machine instructions can only take a 32 bit
operand. If you really must do this sort of thing in RAM ... ask someone else cause this is way outside my
humble expertise anyway ;)

Posted by Anton Shafarenko on Friday May 17 2002, @6:24am[Delete] [Edit]

...and this is why you should proofread. I meant 64GB, not 64MB. (note that I've yet to actually hear of an
x86 machine with >4GB of memory...)

Posted by BAIJUN LI on Monday September 2 2002, @11:36am[Delete] [Edit]

Intel's Itanium and the latest Itanium 2 based
x86 machines have the capacity of supporting
memory much bigger than 64GB as they are 64
bit based processor.

Add your own comment.

Top / Previous / Next / Up / Table of Contents
# MySQL.com home | Site map | Contact us | Press | Jobs | Privacy policy | Trademark info | © 1995-2003 MySQL AB. All rights reserved.