Опубликован: 16.04.2007 | Доступ: свободный | Студентов: 4831 / 591 | Оценка: 4.18 / 4.08 | Длительность: 16:03:00
Лекция 6:

Виды таблиц и способ их хранения

< Лекция 5 || Лекция 6: 1234 || Лекция 7 >
Аннотация: В этой лекции рассказывается о том, какие виды таблиц существуют в MySQL и как организуется физическое хранение данных и способ представления этих таблиц на жестком диске.
Ключевые слова: mysql, файл, ПО, базы данных, файловая система, FAT32, Windows, размер файла, myisam, производительность, СУБД, сервер, разделы, память, gemini, heap, ISAM, merge, Berkeley DB, innodb, типы таблиц MySql, опция, software, COM, открытая лицензия, поддержка, демон, дистрибутив, стабильность, интеграция, первичный ключ, отмена транзакции, log, инструкция, сообщение об ошибке, счетчик, значение, операции, очередь, доступ, таблица, ресурс, переменная, ядро, произвольное, программа, конфигурационный файл, журнал транзакций, префикс, список, псевдоним, файловый дескриптор, извлечение данных, утилита, число с плавающей запятой, IEEE, recover, идентификатор, NULL, определение столбца, text, длина, дефрагментация, запись, размерность, double precision, точность, блокировка, индекс, определение, CAR, компонент, запрос, метасимвол, поток, операционная система, AIX, предел, кэш, дескриптор, место, буфер, активность, команда, открытие файла, поиск, стек

Способ хранения таблиц и баз данных

В MySQL таблице соответствует несколько файлов. Их имена совпадают с именем таблицы, а расширение определяет назначение файла. К примеру, файл с расширением .frm содержит описание структуры таблицы. Что касается баз данных, то они являются подкаталогами основного каталога данных (по умолчанию это /usr/local/var ). Имя подкаталога соответствует имени базы данных. Это означает, что имена баз данных и таблиц отвечают тем же требованиям, которые предъявляются к именам файлов в данной системе. Скажем, файловая система ext2 в Linux чувствительна к регистру символов, a FAT32 в Windows — нет.

Операционные системы налагают свои ограничения на максимальный размер файла. Обычно он составляет от 2 до 4 Гбайт. Для таблиц типа MyISAM, описываемого ниже, все данные сохраняются в одном файле, следовательно, максимальный размер файла одновременно является максимальным размером таблицы.

MySQL позволяет разбивать табличные данные на несколько файлов при наличии опции RAID_TYPE в инструкции CREATE TABLE. Тогда максимальный размер таблицы возрастет во столько раз, сколько файлов для нее создается. Можно даже разместить эти файлы на разных физических дисках, чтобы повысить производительность базы данных.

Выделенные разделы

В некоторых СУБД поддерживаются выделенные файловые системы. Такая файловая система инсталлируется в собственный дисковый раздел, и лишь СУБД знает, как ее использовать. Сервер берет на себя выполнение всех функций файловой системы, тогда как обычно они предоставляются самой операционной системой. Теоретически это способствует повышению производительности.

Тем не менее, MySQL не позволяет записывать базы данных в выделенные разделы, так как изоляция от операционной системы не стоит незначительного выигрыша производительности. Современные операционные системы обладают гораздо большей производительностью, чем раньше, в основном из-за того, что они способны кэшировать дисковые блоки в оперативной памяти. Если бы программе MySQL пришлось выполнять эти функции в обход операционной системы, то тогда память, используемая для кэширования, тоже стала бы выделенной, а объем общедоступной оперативной памяти уменьшился бы.

Управление файлами в рамках операционной системы имеет свои преимущества. Во-первых, разработчики системы проделывают огромную работу по отладке соответствующих функций, а во-вторых, появляется возможность пользоваться стандартными утилитами обработки файлов. Создать резервную копию базы данных MySQL можно с помощью обычной утилиты tar, а не специализированной программы. Выделенные файловые системы требуют целого набора управляющих утилит, в частности для проверки и восстановления файлов. Всего этого нет в MySQL.

Типы таблиц

Начиная с версии 3.23.37 в В MySQL поддерживаются семь типов таблиц. Три из них – Berkley DB, Gemini и Inno DB ориентированы на транзакции, а четыре — Heap, ISAM, Merge и MyIsam — нет. Транзакции являются относительно новым понятием в MySQL, но соответствующие функции для таблиц Berkeley DB и InnoDB существуют уже достаточно давно, что позволило включить их в стандартные бинарные дистрибутивы.

Стандартным типом таблиц в MySQL является тип MyISAM. Он возник на основе более старого типа ISAM, который все еще существует, хотя использовать его не рекомендуется. Переопределить установку по умолчанию позволяет опция TYPE инструкций CREATE TABLE и ALTER TABLE

Berkeley DB

Проект Berkeley DB начался в Калифорнийском университете в Беркли. Впоследствии его авторы сформировали компанию Sleepycat Software (www.sleepycat.com) и занялись распространением коммерческой версии СУБД. Многие утилиты до сих пор работают со старыми версиями BDB (1.85 и 1.86), в то время как компания Sleepycat Software предлагает уже семейство версий 3.x и 4.x. Эта СУБД свободно распространяется с исходными кодами, и ею можно пользоваться бесплатно, за исключением случаев, когда на ее основе планируется создавать приложения, не распространяемые на условиях открытой лицензии.

BDB — это простая файловая СУБД, поддерживающая транзакции, но не располагающая каким-либо языком запросов. В MySQL эта СУБД нужна для того, чтобы можно было работать с таблицами в режиме транзакций.

С Web-узла MySQL можно загрузить скомпилированную версию программы, в которую встроена поддержка BDB. Если впоследствии потребуется отключить эту поддержку, достаточно будет запустить демон mysql с опцией –skip-bdb. На этапе компиляции MySQL поддержка BDB включается с помощью опции –with-berkeley-db. Для MySQL нужна исправленная версия BDB, которая входит в исходный дистрибутив MySQL.

Разработчики MySQL тесно сотрудничают с программистами компании Sleepycat, чтобы гарантировать максимальную эффективность использования библиотеки BDB.

Вообще-то, поддержка BDB в MySQL появилась не так давно (в версии 3.23.24), но, учитывая высокую стабильность обоих продуктов, их интеграция не привела к возникновению каких-либо трудностей для пользователей. Разработчики MySQL планируют и дальше улучшать поддержку BDB.

С функциональной точки зрения таблицы BDB ведут себя аналогично таблицам MyISAM. Нет никаких ограничений на число столбцов или индексов, как в случае резидентных таблиц. Единственное условие: для таблиц BDB обязательно наличие первичного ключа. Если он не задан, MySQL самостоятельно создаст внутренний первичный ключ, охватывающий первые пять байтов каждой записи. К таблицам BDB можно применять инструкцию LOCK TABLES, но при частой работе с ними лучше пользоваться преимуществами транзакций.

Сами транзакции реализуются посредством журнальных файлов, куда записываются сведения об изменении табличных данных. Когда происходит отмена транзакции, функции библиотеки BDB читают журнальные файлы и делают "обратные" исправления. Журнальные файлы носят имена вида log.0000000001 и располагаются в каталоге данных, хотя эту установку можно изменить с помощью опции, указываемой при запуске сервера.

MySQL пытается очищать журнальные файлы BDB в момент создания нового журнального файла. При этом удаляются ненужные файлы. Если не хотите ждать, воспользуйтесь инструкцией FLUSH LOGS.

В BDB таблицы блокируются на уровне страниц. Страница — это совокупность последовательно расположенных записей таблицы. Страничные блокировки необходимы, когда MySQL сканирует таблицу, а также при удалении, вставке и обновлении записей. В отличие от таблиц MyISAM, блокировки таблиц BDB могут приводить к возникновению тупиков, т.е. взаимоблокировок. В подобной ситуации одна или несколько транзакций отменяется. Это следует учитывать при написании приложений. Инструкция, которая приводит к автоматической отмене транзакции, возвращает сообщение об ошибке. Транзакции отменяются также в случае нехватки места в файловой системе.

СУБД BDB не ведет подсчет записей в таблицах, но MySQL хранит собственный счетчик. Он используется модулем оптимизации объединений при выборе индексов. Значение счетчика может быть неточным, если произошел сбой базы данных, но счетчик можно сбросить с помощью инструкции ANALYZE TABLE или OPTIMIZE TABLE. Ведение счетчика записей немного замедляет работу с таблицами BDB.

Табличные данные хранятся в виде двоичного дерева. Это более медленный метод, чем тот, который применяется для таблиц MyISAM. СУБД BDB оставляет в дереве пустые позиции, чтобы операции вставки выполнялись быстрее. В результате размер файла становится большим, чем нужно.

В отличие от таблиц MyISAM, индексы в таблицах BDB не сжимаются, т.е. они занимают больше места. Если в запросе участвуют столбцы одного индекса, обращение к табличным данным не производится, так как в этом нет необходимости. С этой целью BDB позволяет объединять первичный ключ со столбцами другого индекса (для таблиц MyISAM такая возможность не поддерживается).

Gemini

Функции работы с таблицами Gemini реализовали программисты компании NuSphere (www.nusphere.com). Эта компания обеспечивает поддержку и обучение пользователей MySQL. В этих таблицах отсутствуют столбцы типа BLOB и TEXT. Количество пользователей, которые могут одновременно работать с таблицами, по умолчанию равно 100. Данную установку можно изменить с помощью серверной переменной gemini_connection_limit.

Таблицы Gemini блокируются на уровне записей, так как это выгоднее с точки зрения многопользовательской работы. Если заблокировать всю таблицу, другие потоки вынуждены будут встать в очередь на доступ к таблице. Блокировки записей предотвращают доступ к единичным записям, позволяя нескольким потокам работать с одной таблицей, но в разных ее "участках".

Как и в случае таблиц MyISAM, доступ к файлу данных таблицы Gemini не требуется, если в запросе участвуют столбцы одного индекса. Для этих таблиц также ведется счетчик записей, используемый модулем оптимизации объединений.

< Лекция 5 || Лекция 6: 1234 || Лекция 7 >
Дмитрий Черепенин
Дмитрий Черепенин

Какого года данный курс?

Геннадий Шестаков
Геннадий Шестаков
Беларусь, Орша
Наталья Алмаева
Наталья Алмаева
Россия