В MySQL таблице соответствует несколько файлов. Их имена совпадают с именем таблицы, а расширение определяет назначение файла. К примеру, файл с расширением .frm содержит описание структуры таблицы. Что касается баз данных, то они являются подкаталогами основного каталога данных (по умолчанию это /usr/local/var ). Имя подкаталога соответствует имени базы данных. Это означает, что имена баз данных и таблиц отвечают тем же требованиям, которые предъявляются к именам файлов в данной системе. Скажем, файловая система ext2 в Linux чувствительна к регистру символов, a в Windows — нет.
Операционные системы налагают свои ограничения на максимальный размер файла. Обычно он составляет от 2 до 4 Гбайт. Для таблиц типа
MySQL позволяет разбивать табличные данные на несколько файлов при наличии опции RAID_TYPE в инструкции CREATE TABLE. Тогда максимальный размер таблицы возрастет во столько раз, сколько файлов для нее создается. Можно даже разместить эти файлы на разных физических дисках, чтобы повысить производительность базы данных.
В некоторых СУБД поддерживаются выделенные файловые системы. Такая файловая система инсталлируется в собственный дисковый раздел, и лишь СУБД знает, как ее использовать. Сервер берет на себя выполнение всех функций файловой системы, тогда как обычно они предоставляются самой операционной системой. Теоретически это способствует повышению производительности.
Тем не менее, MySQL не позволяет записывать базы данных в выделенные разделы, так как изоляция от операционной системы не стоит незначительного выигрыша производительности. Современные операционные системы обладают гораздо большей производительностью, чем раньше, в основном из-за того, что они способны кэшировать дисковые блоки в оперативной памяти. Если бы программе MySQL пришлось выполнять эти функции в обход операционной системы, то тогда память, используемая для кэширования, тоже стала бы выделенной, а объем общедоступной оперативной памяти уменьшился бы.
Управление файлами в рамках операционной системы имеет свои преимущества. Во-первых, разработчики системы проделывают огромную работу по отладке соответствующих функций, а во-вторых, появляется возможность пользоваться стандартными утилитами обработки файлов. Создать резервную копию базы данных MySQL можно с помощью обычной утилиты tar, а не специализированной программы. Выделенные файловые системы требуют целого набора управляющих утилит, в частности для проверки и восстановления файлов. Всего этого нет в MySQL.
Начиная с версии 3.23.37 в В MySQL поддерживаются семь типов таблиц. Три из них – Berkley DB,
Стандартным TYPE инструкций CREATE TABLE и ALTER TABLE
Проект
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 ведут себя аналогично таблицам LOCK TABLES, но при частой работе с ними лучше пользоваться преимуществами транзакций.
Сами транзакции реализуются посредством журнальных файлов, куда записываются сведения об изменении табличных данных. Когда происходит
MySQL пытается очищать журнальные файлы BDB в момент создания нового журнального файла. При этом удаляются ненужные файлы. Если не хотите ждать, воспользуйтесь инструкцией FLUSH LOGS.
В BDB таблицы блокируются на уровне страниц. Страница — это совокупность последовательно расположенных записей таблицы. Страничные блокировки необходимы, когда MySQL сканирует таблицу, а также при удалении, вставке и обновлении записей. В отличие от таблиц
СУБД BDB не ведет подсчет записей в таблицах, но MySQL хранит собственный счетчик. Он используется модулем оптимизации объединений при выборе индексов. Значение счетчика может быть неточным, если произошел сбой базы данных, но счетчик можно сбросить с помощью инструкции ANALYZE TABLE или OPTIMIZE TABLE. Ведение счетчика записей немного замедляет работу с таблицами BDB.
Табличные данные хранятся в виде двоичного дерева. Это более медленный метод, чем тот, который применяется для таблиц
В отличие от таблиц
Функции работы с таблицами BLOB и TEXT. Количество пользователей, которые могут одновременно работать с таблицами, по умолчанию равно 100. Данную установку можно изменить с помощью серверной переменной gemini_connection_limit.
Таблицы
Как и в случае таблиц
MySQL хранит таблицы типа
Резидентные таблицы не располагают многими возможностями обычных таблиц. Они не могут иметь столбцы типа BLOB или TEXT. Нельзя использовать флаг AUTO_INCREMENT. Можно создавать индексы, но нельзя индексировать столбцы, допускающие значения NULL. Индексы используются только в операциях = и <=>.
Записи резидентных таблиц имеют фиксированную длину. Для столбцов типа VARCHAR сразу выделяется максимальное число байтов. Поскольку память — ограниченный ресурс, можно задать предельное количество записей в резидентной таблице.
Для этого предназначена опция max_rows инструкции CREATE TABLE. Серверная переменная max_heap_table_size задает максимальный объем памяти, занимаемой всеми резидентными таблицами.
Доступ к резидентным таблицам имеют все пользователи. Эти таблицы уничтожаются при выключении сервера.
СУБД
На Web-узле mysql с опцией –skip-. На этапе компиляции MySQL поддержка –with-. Исходные коды
В отличие от таблиц
В листинге 6.1 приведен пример опций, которые необходимо добавить в конфигурационный файл в группу [mysql] чтобы активизировать таблицы
innodb_data_home_dir = /usr/local/var/innodb/ innodb_data_file_path = ibdata1/ibdata1:100M; ibdata2/ibdata2:100M set-variable = innodb_mirrored_log_groups = 1 innodb_log_group_home_dir = /disk2/innodb/log set-variable = innodb_log_files_in_group = 3 set-variable = innodb_log_file_size = 16M set-variable = innodb_log_buffer_size = 8M innodb_flush_log_at_trx_commit = 1 innodb_log_arch_dir = /disk2/innodb/log innodb_log_archive = 0 set_variable = innodb_buffer_pool_size = 25M set_variable = innodb_additional_mem_pool_size = 5M set_variable = innodb_file_io_threads = 4 set_variable = innodb_lock_wait_timeout = 50
После добавления опций в конфигурационный файл необходимо перезапустить сервер MySQL. Все необходимые файлы будут созданы автоматически. На это может уйти некоторое время, в зависимости от размера файлов и скорости жесткого диска.
Таблицы LOCK TABLE может конфликтовать с блокировками
На случай
На момент создания этого курса существовало несколько ограничений таблиц DROP TABLE, поэтому каждую таблицу приходится удалять отдельно. Не разрешается индексировать префикс столбца, а также индексировать столбцы типа BLOB и TEXT. Максимальное количество столбцов в таблице — 1000. Флаг DELAYED в инструкции INSERT не поддерживается.
До версии 3.23 стандартным
В таблице типа
Объединенная таблица создается очень быстро, так как требуется всего лишь сформировать список имен исходных таблиц. В случае уничтожения такой таблицы удаляется лишь MRG-файл, но не исходные таблицы.
У объединенных таблиц есть ряд недостатков. В них нельзя вставлять записи, поскольку программа MySQL не имеет возможности определить, в какую из исходных таблиц они должны быть помещены. Кроме того, при работе с такими таблицами задействуется большее число
Несмотря на упомянутые ограничения, у объединенных таблиц есть и несомненные преимущества. Они позволяют интерпретировать группу таблиц как единое целое и в то же время продолжать работать с отдельными ее компонентами. Это идеальное решение для крупных таблиц, которые легко разбиваются на фрагменты. Например, журнальные файлы Web-сервера можно группировать в месячные таблицы. Если одна из таблиц повреждается, необходимо восстанавливать только ее, а не всю группу. Кроме того, исходные таблицы можно хранить на разных физических дисках, что способствует повышению производительности.
myisamchk для проверки и восстановления таблиц и утилита myisampack для создания сжатых таблиц.
Таблицы MylSAM являются платформо-независимыми. Табличные файлы можно перемещать между компьютерами разных архитектур и разными операционными системами без всякого преобразования. Для этого MySQL хранит все
MySQL хранит счетчик подключений к таблице MylSAM. Когда таблица закрывается, счетчик сбрасывается в нуль. Если сервер неожиданно завершает работу, счетчик остается положительным числом. В таком случае в процессе перезапуска сервер обнаружит проблему. Это не означает, что таблица непременно повреждена, но подобная возможность существует. Следует немедленно выполнить инструкцию CHECK TABLE или вызвать утилиту myisamchk. Можно также запустить демон mysql с опцией –, чтобы заставить его восстанавливать все таблицы
Для таблиц DELETE и могут быть заполнены последующими инструкциями INSERT. MySQL блокирует таблицу INSERT заполняет пустой участок.
Для автоинкрементных столбцов таблиц
Индексные файлы имеют расширение .MYI. Файлы с расширением .MYD содержат данные, а с расширением .frm – схему таблицы. Если индексный файл по какой-то причине теряется, программа перестраивает индексы, используя информацию из frm-файла.
По умолчанию в каждой таблице может быть не более тридцати двух индексов, но это значение можно повысить до шестидесяти четырех. Индексы создаются в виде двоичных деревьев. Разрешается индексировать столбцы типа BLOB и TEXT, а также столбцы, допускающие значения NULL.
В таблицах myisampack.
Таблица будет иметь записи фиксированной длины, если в ней нет столбцов типа VARCHAR, BLOB или TEXT. Одинаковая длина записей имеет свои преимущества. Утилите myisampack будет проще восстанавливать поврежденные записи, если она знает их точную длину. Такие записи никогда не приходится разбивать на части при наличии в таблице пустых промежутков, что ускоряет операции чтения. Правда, записи фиксированной длины обычно занимают больше места на диске.
Все записи таблицы будут динамическими, если в ней есть столбцы типа VARCHAR, BLOB или TEXT. Возможно также приведение столбцов типа CHAR к типу VARCHAR, если их длина больше четырех символов. Длина каждой записи отслеживается по специальному заголовку. В нем указана длина текущего сегмента записи. Поскольку при повреждении таблицы связи между фрагментами могут теряться, корректное восстановление записи не всегда возможно.
Динамические записи часто требуют OPTIMIZE TABLES.
Сжатые таблицы занимают гораздо меньше места, чем таблицы с фиксированными или динамическими записями. Их удобно создавать в медленных файловых системах, например в тех, которые используются в компакт-дисках. Каждая запись сжимается отдельно с применением отдельной хэш-таблицы для каждого столбца. Сжатая таблица создается утилитой myisampack. С помощью утилиты myisamchk можно преобразовать сжатую таблицу обратно в фиксированный или динамический формат.
Если таблица
В табл. 6.1 указаны размерности стандартных типов данных MySQL. Значения некоторых типов всегда занимают фиксированный объем памяти. Например, размерность столбцов типа INTEGER всегда составляет 4 байта. Столбцы типа CHAR могут иметь размерность от 0 до 255, но в момент создания таблицы под них отводится фиксированный объем памяти. Существуют также столбцы переменной размерности. Например, столбцы типа VARCHAR и BLOB интерпретируются в соответствии с их содержимым.
| Тип | Размерность |
|---|---|
BIGINT |
8 байтов |
BLOB, TEXT |
длина содержимого + 2 байта |
CHAR |
указанное число байтов |
DATE |
3 байта |
DATETIME |
8 байтов |
DECIMAL (длина, точность) |
длина + 1 байт, если точность равна 0; в противном случае — длина + 2 байта |
DOUBLE |
8 байтов |
|
8 байтов |
ENUM |
1 байт, если в перечислении менее 255 элементов; в противном случае — 2 байта |
FLOAT |
4 байта |
FLOAT (длина) |
4 байта, если длина <= 24; в противном случае — 8 байтов |
INT |
4 байта |
INTEGER |
4 байта |
LONGBLOB, LONGTEXT |
длина + 2 байта |
MEDIUMBLOB, MEDIUMTEXT |
длина + 2 байта |
MEDIUMINT |
3 байта |
NUMERIC (длина, точность) |
длина + 1 байт, если точность равна 0; в противном случае – длина + 2 байта |
REAL |
8 байтов |
SET |
1, 2, 3, 4 или 8 байтов, в зависимости от количества элементов множества |
SMALLINT |
2 байта |
TIME |
3 байта |
TIMESTAMP |
4 байта |
TINYBLOB, TINYTEXT |
длина + 2 байта |
TINYINT |
1 байт |
VARCHAR (длина) |
длина содержимого + 1 байт |
YEAR |
1 байт |
Как указывалось выше, таблицы
Значения столбцов типа DECIMAL и NUMERIC хранятся в строковом виде, что позволяет обеспечить точность представления десятичных чисел. Каждой цифре соответствует один символ, еще по одному символу отводится на знаковый разряд и десятичную точку.
В MySQL разрешается явно блокировать таблицы с помощью инструкции LOCK TABLES. Тем не менее, не рекомендуется делать это для таблиц тех типов, которые поддерживают транзакции. Блокировки и транзакции — это два разных способа решения проблемы одновременного доступа к таблице, поэтому нужно сделать выбор в пользу одного из них.
В зависимости от инструкции могут также применяться неявные блокировки. Например, инструкция UPDATE способна немедленно заблокировать таблицу, запретив доступ к ней другим потокам. Блокировки обоих типов защищены от возникновения тупиковых ситуаций, так что можно не волноваться по поводу отмены той или иной инструкции.
Можно заблокировать таблицу таким образом, чтобы разрешить другим потокам обращаться к ней для чтения. Это называется блокировкой чтения. Блокировка записи гарантирует текущему потоку монопольный доступ к таблице. Запросы на чтение откладываются до тех пор, пока не будут сняты все блокировки записи. Эту установку можно изменить с помощью флагов инструкций либо путем задания специальных серверных переменных. Для SQL-инструкций создаются две очереди. Чтобы программа MySQL начала извлекать инструкции из очереди на чтение, очередь на запись должна быть пуста. При наличии флага LOW_PRIORITY инструкции DELETE, INSERT и UPDATE помещаются в очередь на чтение, т.е. они получают такой же приоритет, что и инструкции SELECT. Флаг HIGH_PRIORITY переводит инструкцию SELECT в очередь на запись.
В MySQL индексы хранятся в виде двоичных деревьев. Деревья перестраиваются по мере вставки записей. Это означает, что каждый индекс вызывает небольшое снижение производительности. Как правило, индексы повышают скорость операций выборки за счет снижения скорости операций записи. Тем не менее, наличие индекса еще не гарантирует никакого ускорения. Нужно соотносить их с теми запросами, которые планируется выполнять. Чтобы понять, насколько эффективным окажется тот или иной индекс, пользуйтесь инструкцией EXPLAIN.
Определения индексов хранятся в frm-файле а сами индексируемые значения — в файле с расширением .MYI. Если индексный файл отсутствует на момент запуска сервера, он будет автоматически воссоздан. Таким образом, при создании резервных копий можно не заботиться об индексах в целях экономии места. Позднее, в процессе восстановления базы данных, программа MySQL создаст индексы заново на основании схемы таблицы.
Индексы способны повысить производительность инструкций, связанных с поиском записей. Они ускоряют процесс сравнения столбцов при выполнении операций объединения. Кроме того, они помогают находить минимальное и максимальное значения столбца и ускоряют выполнение инструкций SELECT с предложением ORDER BY.
Чтобы индекс был задействован, он должен быть указан во всех частях предложения WHERE. Если используется лишь часть индекса, то должен соблюдаться порядок обращения к индексируемым столбцам: слева направо. Для примера рассмотрим таблицу, определение которой приведено в листинге 6.2.
CREATE TABLE car ( Make CHAR(32) NOT NULL, Model CHAR(32) NOT NULL, Introduced YEAR, PRIMARY KEY (MAKE,Model) );
У таблицы car имеется составной первичный ключ. В запросе, который показан в листинге 6.3, индекс будет использован, так как столбец Make является самым левым компонентом индекса.
SELECT * FROM car WHERE Make='Ford';
А вот в следующем запросе (листинг 6.4) этого не произойдет, поскольку правило очередности столбцов не соблюдается.
SELECT * FROM car WHERE Model='Pinto';
В листинге 6.5 индекс также не используется, из-за того, что самый левый компонент индекса нельзя применить к каждой записи. Если бы в предложении WHERE стоял оператор AND, а не OR, все было бы наоборот.
SELECT * FROM car WHERE Make='Ford' OR Model='Impala';
Следующий запрос (листинг 6.6) является правильным с точки зрения использования индекса. В данном случае просмотр значений столбца осуществляется слева направо.
SELECT * FROM car WHERE Make LIKE 'F%';
В листинге 6.7 индекс не используется, потому что просмотр значений столбца осуществляется справа налево (метасимвол % стоит вначале).
SELECT * FROM car WHERE Make LIKE '%d';
Сервер MySQL представляет собой один процесс со множеством потоков. Для каждого сеанса подключения к серверу создается свой поток. Каждому потоку требуется один или несколько дескрипторов файлов, чтобы он мог осуществлять чтение и запись таблиц. Операционная система ограничивает количество
Чтобы не исчерпать лимит ресурсов, MySQL хранит кэш
Размер кэша дескрипторов можно задать другим, но не забывайте об ограничении, которое накладывается операционной системой. Правда, ее собственный лимит тоже можно изменить. Для этого существует, например, команда unlimit. Еще один способ — перекомпиляция ядра.
Чтобы получить доступ к таблице, поток должен иметь в своем распоряжении дескриптор ее файла данных. Все потоки совместно владеют дескриптором индексного файла. Таким образом, когда три потока одновременно извлекают данные из таблицы, используются четыре дескриптора. Если таблица дважды указана в предложении FROM, например в случае операции самообъединения, программа MySQL вынуждена открывать отдельный дескриптор для каждой ссылки на таблицу.
Открытие файла подразумевает его поиск в каталоге, поэтому чем больше файлов в каталоге, тем больше времени уходит на поиск файла. В MySQL таблицы хранятся в виде файлов, следовательно, чем больше таблиц в базе данных, тем дольше открывается новый дескриптор. Эта зависимость ослабевает благодаря кэшу дескрипторов, поскольку дескрипторы долгое время остаются открытыми.
В MySQL специальные буферы и кэши применяются для самых разных целей. Их размеры можно задавать в конфигурационном файле или в командной строке запуска сервера. У каждого потока есть свой стек, буфер приема входных данных от клиента и буфер результатов запроса. Размер стека задается серверной переменной thread_stack, а размеры обоих буферов — переменной net_buffer_length. Последняя определяет начальные размеры буферов, так как они могут увеличиваться в случае необходимости, например, при обработке столбцов типа BLOB или TEXT.
Все потоки совместно используют индексный буфер. Его размер определяется переменной key_buffer_size. В операциях объединения, проходящих без участия индексных столбцов, используется отдельный буфер (переменная join_buffer_size ), как и в операциях сканирования таблиц (переменная record_buffer ).
Если для выполнения операции объединения требуется временная таблица, она создается как резидентная (тип tmp_table_size. После превышения этого предела таблица преобразуется в формат
В MySQL таблице соответствует несколько файлов. Их имена совпадают с именем таблицы, а расширение определяет назначение файла. К примеру, файл с расширением .frm содержит описание структуры таблицы. Что касается баз данных, то они являются подкаталогами основного каталога данных (по умолчанию это /usr/local/var ). Имя подкаталога соответствует имени базы данных. Это означает, что имена баз данных и таблиц отвечают тем же требованиям, которые предъявляются к именам файлов в данной системе. Скажем, файловая система ext2 в Linux чувствительна к регистру символов, a в Windows — нет.
Операционные системы налагают свои ограничения на максимальный размер файла. Обычно он составляет от 2 до 4 Гбайт. Для таблиц типа
MySQL позволяет разбивать табличные данные на несколько файлов при наличии опции RAID_TYPE в инструкции CREATE TABLE. Тогда максимальный размер таблицы возрастет во столько раз, сколько файлов для нее создается. Можно даже разместить эти файлы на разных физических дисках, чтобы повысить производительность базы данных.
В некоторых СУБД поддерживаются выделенные файловые системы. Такая файловая система инсталлируется в собственный дисковый раздел, и лишь СУБД знает, как ее использовать. Сервер берет на себя выполнение всех функций файловой системы, тогда как обычно они предоставляются самой операционной системой. Теоретически это способствует повышению производительности.
Тем не менее, MySQL не позволяет записывать базы данных в выделенные разделы, так как изоляция от операционной системы не стоит незначительного выигрыша производительности. Современные операционные системы обладают гораздо большей производительностью, чем раньше, в основном из-за того, что они способны кэшировать дисковые блоки в оперативной памяти. Если бы программе MySQL пришлось выполнять эти функции в обход операционной системы, то тогда память, используемая для кэширования, тоже стала бы выделенной, а объем общедоступной оперативной памяти уменьшился бы.
Управление файлами в рамках операционной системы имеет свои преимущества. Во-первых, разработчики системы проделывают огромную работу по отладке соответствующих функций, а во-вторых, появляется возможность пользоваться стандартными утилитами обработки файлов. Создать резервную копию базы данных MySQL можно с помощью обычной утилиты tar, а не специализированной программы. Выделенные файловые системы требуют целого набора управляющих утилит, в частности для проверки и восстановления файлов. Всего этого нет в MySQL.
Начиная с версии 3.23.37 в В MySQL поддерживаются семь типов таблиц. Три из них – Berkley DB,
Стандартным TYPE инструкций CREATE TABLE и ALTER TABLE
Проект
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 ведут себя аналогично таблицам LOCK TABLES, но при частой работе с ними лучше пользоваться преимуществами транзакций.
Сами транзакции реализуются посредством журнальных файлов, куда записываются сведения об изменении табличных данных. Когда происходит
MySQL пытается очищать журнальные файлы BDB в момент создания нового журнального файла. При этом удаляются ненужные файлы. Если не хотите ждать, воспользуйтесь инструкцией FLUSH LOGS.
В BDB таблицы блокируются на уровне страниц. Страница — это совокупность последовательно расположенных записей таблицы. Страничные блокировки необходимы, когда MySQL сканирует таблицу, а также при удалении, вставке и обновлении записей. В отличие от таблиц
СУБД BDB не ведет подсчет записей в таблицах, но MySQL хранит собственный счетчик. Он используется модулем оптимизации объединений при выборе индексов. Значение счетчика может быть неточным, если произошел сбой базы данных, но счетчик можно сбросить с помощью инструкции ANALYZE TABLE или OPTIMIZE TABLE. Ведение счетчика записей немного замедляет работу с таблицами BDB.
Табличные данные хранятся в виде двоичного дерева. Это более медленный метод, чем тот, который применяется для таблиц
В отличие от таблиц
Функции работы с таблицами BLOB и TEXT. Количество пользователей, которые могут одновременно работать с таблицами, по умолчанию равно 100. Данную установку можно изменить с помощью серверной переменной gemini_connection_limit.
Таблицы
Как и в случае таблиц
MySQL хранит таблицы типа
Резидентные таблицы не располагают многими возможностями обычных таблиц. Они не могут иметь столбцы типа BLOB или TEXT. Нельзя использовать флаг AUTO_INCREMENT. Можно создавать индексы, но нельзя индексировать столбцы, допускающие значения NULL. Индексы используются только в операциях = и <=>.
Записи резидентных таблиц имеют фиксированную длину. Для столбцов типа VARCHAR сразу выделяется максимальное число байтов. Поскольку память — ограниченный ресурс, можно задать предельное количество записей в резидентной таблице.
Для этого предназначена опция max_rows инструкции CREATE TABLE. Серверная переменная max_heap_table_size задает максимальный объем памяти, занимаемой всеми резидентными таблицами.
Доступ к резидентным таблицам имеют все пользователи. Эти таблицы уничтожаются при выключении сервера.
СУБД
На Web-узле mysql с опцией –skip-. На этапе компиляции MySQL поддержка –with-. Исходные коды
В отличие от таблиц
В листинге 6.1 приведен пример опций, которые необходимо добавить в конфигурационный файл в группу [mysql] чтобы активизировать таблицы
innodb_data_home_dir = /usr/local/var/innodb/ innodb_data_file_path = ibdata1/ibdata1:100M; ibdata2/ibdata2:100M set-variable = innodb_mirrored_log_groups = 1 innodb_log_group_home_dir = /disk2/innodb/log set-variable = innodb_log_files_in_group = 3 set-variable = innodb_log_file_size = 16M set-variable = innodb_log_buffer_size = 8M innodb_flush_log_at_trx_commit = 1 innodb_log_arch_dir = /disk2/innodb/log innodb_log_archive = 0 set_variable = innodb_buffer_pool_size = 25M set_variable = innodb_additional_mem_pool_size = 5M set_variable = innodb_file_io_threads = 4 set_variable = innodb_lock_wait_timeout = 50
После добавления опций в конфигурационный файл необходимо перезапустить сервер MySQL. Все необходимые файлы будут созданы автоматически. На это может уйти некоторое время, в зависимости от размера файлов и скорости жесткого диска.
Таблицы LOCK TABLE может конфликтовать с блокировками
На случай
На момент создания этого курса существовало несколько ограничений таблиц DROP TABLE, поэтому каждую таблицу приходится удалять отдельно. Не разрешается индексировать префикс столбца, а также индексировать столбцы типа BLOB и TEXT. Максимальное количество столбцов в таблице — 1000. Флаг DELAYED в инструкции INSERT не поддерживается.
До версии 3.23 стандартным
В таблице типа
Объединенная таблица создается очень быстро, так как требуется всего лишь сформировать список имен исходных таблиц. В случае уничтожения такой таблицы удаляется лишь MRG-файл, но не исходные таблицы.
У объединенных таблиц есть ряд недостатков. В них нельзя вставлять записи, поскольку программа MySQL не имеет возможности определить, в какую из исходных таблиц они должны быть помещены. Кроме того, при работе с такими таблицами задействуется большее число
Несмотря на упомянутые ограничения, у объединенных таблиц есть и несомненные преимущества. Они позволяют интерпретировать группу таблиц как единое целое и в то же время продолжать работать с отдельными ее компонентами. Это идеальное решение для крупных таблиц, которые легко разбиваются на фрагменты. Например, журнальные файлы Web-сервера можно группировать в месячные таблицы. Если одна из таблиц повреждается, необходимо восстанавливать только ее, а не всю группу. Кроме того, исходные таблицы можно хранить на разных физических дисках, что способствует повышению производительности.
myisamchk для проверки и восстановления таблиц и утилита myisampack для создания сжатых таблиц.
Таблицы MylSAM являются платформо-независимыми. Табличные файлы можно перемещать между компьютерами разных архитектур и разными операционными системами без всякого преобразования. Для этого MySQL хранит все
MySQL хранит счетчик подключений к таблице MylSAM. Когда таблица закрывается, счетчик сбрасывается в нуль. Если сервер неожиданно завершает работу, счетчик остается положительным числом. В таком случае в процессе перезапуска сервер обнаружит проблему. Это не означает, что таблица непременно повреждена, но подобная возможность существует. Следует немедленно выполнить инструкцию CHECK TABLE или вызвать утилиту myisamchk. Можно также запустить демон mysql с опцией –, чтобы заставить его восстанавливать все таблицы
Для таблиц DELETE и могут быть заполнены последующими инструкциями INSERT. MySQL блокирует таблицу INSERT заполняет пустой участок.
Для автоинкрементных столбцов таблиц
Индексные файлы имеют расширение .MYI. Файлы с расширением .MYD содержат данные, а с расширением .frm – схему таблицы. Если индексный файл по какой-то причине теряется, программа перестраивает индексы, используя информацию из frm-файла.
По умолчанию в каждой таблице может быть не более тридцати двух индексов, но это значение можно повысить до шестидесяти четырех. Индексы создаются в виде двоичных деревьев. Разрешается индексировать столбцы типа BLOB и TEXT, а также столбцы, допускающие значения NULL.
В таблицах myisampack.
Таблица будет иметь записи фиксированной длины, если в ней нет столбцов типа VARCHAR, BLOB или TEXT. Одинаковая длина записей имеет свои преимущества. Утилите myisampack будет проще восстанавливать поврежденные записи, если она знает их точную длину. Такие записи никогда не приходится разбивать на части при наличии в таблице пустых промежутков, что ускоряет операции чтения. Правда, записи фиксированной длины обычно занимают больше места на диске.
Все записи таблицы будут динамическими, если в ней есть столбцы типа VARCHAR, BLOB или TEXT. Возможно также приведение столбцов типа CHAR к типу VARCHAR, если их длина больше четырех символов. Длина каждой записи отслеживается по специальному заголовку. В нем указана длина текущего сегмента записи. Поскольку при повреждении таблицы связи между фрагментами могут теряться, корректное восстановление записи не всегда возможно.
Динамические записи часто требуют OPTIMIZE TABLES.
Сжатые таблицы занимают гораздо меньше места, чем таблицы с фиксированными или динамическими записями. Их удобно создавать в медленных файловых системах, например в тех, которые используются в компакт-дисках. Каждая запись сжимается отдельно с применением отдельной хэш-таблицы для каждого столбца. Сжатая таблица создается утилитой myisampack. С помощью утилиты myisamchk можно преобразовать сжатую таблицу обратно в фиксированный или динамический формат.
Если таблица
В табл. 6.1 указаны размерности стандартных типов данных MySQL. Значения некоторых типов всегда занимают фиксированный объем памяти. Например, размерность столбцов типа INTEGER всегда составляет 4 байта. Столбцы типа CHAR могут иметь размерность от 0 до 255, но в момент создания таблицы под них отводится фиксированный объем памяти. Существуют также столбцы переменной размерности. Например, столбцы типа VARCHAR и BLOB интерпретируются в соответствии с их содержимым.
| Тип | Размерность |
|---|---|
BIGINT |
8 байтов |
BLOB, TEXT |
длина содержимого + 2 байта |
CHAR |
указанное число байтов |
DATE |
3 байта |
DATETIME |
8 байтов |
DECIMAL (длина, точность) |
длина + 1 байт, если точность равна 0; в противном случае — длина + 2 байта |
DOUBLE |
8 байтов |
|
8 байтов |
ENUM |
1 байт, если в перечислении менее 255 элементов; в противном случае — 2 байта |
FLOAT |
4 байта |
FLOAT (длина) |
4 байта, если длина <= 24; в противном случае — 8 байтов |
INT |
4 байта |
INTEGER |
4 байта |
LONGBLOB, LONGTEXT |
длина + 2 байта |
MEDIUMBLOB, MEDIUMTEXT |
длина + 2 байта |
MEDIUMINT |
3 байта |
NUMERIC (длина, точность) |
длина + 1 байт, если точность равна 0; в противном случае – длина + 2 байта |
REAL |
8 байтов |
SET |
1, 2, 3, 4 или 8 байтов, в зависимости от количества элементов множества |
SMALLINT |
2 байта |
TIME |
3 байта |
TIMESTAMP |
4 байта |
TINYBLOB, TINYTEXT |
длина + 2 байта |
TINYINT |
1 байт |
VARCHAR (длина) |
длина содержимого + 1 байт |
YEAR |
1 байт |
Как указывалось выше, таблицы
Значения столбцов типа DECIMAL и NUMERIC хранятся в строковом виде, что позволяет обеспечить точность представления десятичных чисел. Каждой цифре соответствует один символ, еще по одному символу отводится на знаковый разряд и десятичную точку.
В MySQL разрешается явно блокировать таблицы с помощью инструкции LOCK TABLES. Тем не менее, не рекомендуется делать это для таблиц тех типов, которые поддерживают транзакции. Блокировки и транзакции — это два разных способа решения проблемы одновременного доступа к таблице, поэтому нужно сделать выбор в пользу одного из них.
В зависимости от инструкции могут также применяться неявные блокировки. Например, инструкция UPDATE способна немедленно заблокировать таблицу, запретив доступ к ней другим потокам. Блокировки обоих типов защищены от возникновения тупиковых ситуаций, так что можно не волноваться по поводу отмены той или иной инструкции.
Можно заблокировать таблицу таким образом, чтобы разрешить другим потокам обращаться к ней для чтения. Это называется блокировкой чтения. Блокировка записи гарантирует текущему потоку монопольный доступ к таблице. Запросы на чтение откладываются до тех пор, пока не будут сняты все блокировки записи. Эту установку можно изменить с помощью флагов инструкций либо путем задания специальных серверных переменных. Для SQL-инструкций создаются две очереди. Чтобы программа MySQL начала извлекать инструкции из очереди на чтение, очередь на запись должна быть пуста. При наличии флага LOW_PRIORITY инструкции DELETE, INSERT и UPDATE помещаются в очередь на чтение, т.е. они получают такой же приоритет, что и инструкции SELECT. Флаг HIGH_PRIORITY переводит инструкцию SELECT в очередь на запись.
В MySQL индексы хранятся в виде двоичных деревьев. Деревья перестраиваются по мере вставки записей. Это означает, что каждый индекс вызывает небольшое снижение производительности. Как правило, индексы повышают скорость операций выборки за счет снижения скорости операций записи. Тем не менее, наличие индекса еще не гарантирует никакого ускорения. Нужно соотносить их с теми запросами, которые планируется выполнять. Чтобы понять, насколько эффективным окажется тот или иной индекс, пользуйтесь инструкцией EXPLAIN.
Определения индексов хранятся в frm-файле а сами индексируемые значения — в файле с расширением .MYI. Если индексный файл отсутствует на момент запуска сервера, он будет автоматически воссоздан. Таким образом, при создании резервных копий можно не заботиться об индексах в целях экономии места. Позднее, в процессе восстановления базы данных, программа MySQL создаст индексы заново на основании схемы таблицы.
Индексы способны повысить производительность инструкций, связанных с поиском записей. Они ускоряют процесс сравнения столбцов при выполнении операций объединения. Кроме того, они помогают находить минимальное и максимальное значения столбца и ускоряют выполнение инструкций SELECT с предложением ORDER BY.
Чтобы индекс был задействован, он должен быть указан во всех частях предложения WHERE. Если используется лишь часть индекса, то должен соблюдаться порядок обращения к индексируемым столбцам: слева направо. Для примера рассмотрим таблицу, определение которой приведено в листинге 6.2.
CREATE TABLE car ( Make CHAR(32) NOT NULL, Model CHAR(32) NOT NULL, Introduced YEAR, PRIMARY KEY (MAKE,Model) );
У таблицы car имеется составной первичный ключ. В запросе, который показан в листинге 6.3, индекс будет использован, так как столбец Make является самым левым компонентом индекса.
SELECT * FROM car WHERE Make='Ford';
А вот в следующем запросе (листинг 6.4) этого не произойдет, поскольку правило очередности столбцов не соблюдается.
SELECT * FROM car WHERE Model='Pinto';
В листинге 6.5 индекс также не используется, из-за того, что самый левый компонент индекса нельзя применить к каждой записи. Если бы в предложении WHERE стоял оператор AND, а не OR, все было бы наоборот.
SELECT * FROM car WHERE Make='Ford' OR Model='Impala';
Следующий запрос (листинг 6.6) является правильным с точки зрения использования индекса. В данном случае просмотр значений столбца осуществляется слева направо.
SELECT * FROM car WHERE Make LIKE 'F%';
В листинге 6.7 индекс не используется, потому что просмотр значений столбца осуществляется справа налево (метасимвол % стоит вначале).
SELECT * FROM car WHERE Make LIKE '%d';
Сервер MySQL представляет собой один процесс со множеством потоков. Для каждого сеанса подключения к серверу создается свой поток. Каждому потоку требуется один или несколько дескрипторов файлов, чтобы он мог осуществлять чтение и запись таблиц. Операционная система ограничивает количество
Чтобы не исчерпать лимит ресурсов, MySQL хранит кэш
Размер кэша дескрипторов можно задать другим, но не забывайте об ограничении, которое накладывается операционной системой. Правда, ее собственный лимит тоже можно изменить. Для этого существует, например, команда unlimit. Еще один способ — перекомпиляция ядра.
Чтобы получить доступ к таблице, поток должен иметь в своем распоряжении дескриптор ее файла данных. Все потоки совместно владеют дескриптором индексного файла. Таким образом, когда три потока одновременно извлекают данные из таблицы, используются четыре дескриптора. Если таблица дважды указана в предложении FROM, например в случае операции самообъединения, программа MySQL вынуждена открывать отдельный дескриптор для каждой ссылки на таблицу.
Открытие файла подразумевает его поиск в каталоге, поэтому чем больше файлов в каталоге, тем больше времени уходит на поиск файла. В MySQL таблицы хранятся в виде файлов, следовательно, чем больше таблиц в базе данных, тем дольше открывается новый дескриптор. Эта зависимость ослабевает благодаря кэшу дескрипторов, поскольку дескрипторы долгое время остаются открытыми.
В MySQL специальные буферы и кэши применяются для самых разных целей. Их размеры можно задавать в конфигурационном файле или в командной строке запуска сервера. У каждого потока есть свой стек, буфер приема входных данных от клиента и буфер результатов запроса. Размер стека задается серверной переменной thread_stack, а размеры обоих буферов — переменной net_buffer_length. Последняя определяет начальные размеры буферов, так как они могут увеличиваться в случае необходимости, например, при обработке столбцов типа BLOB или TEXT.
Все потоки совместно используют индексный буфер. Его размер определяется переменной key_buffer_size. В операциях объединения, проходящих без участия индексных столбцов, используется отдельный буфер (переменная join_buffer_size ), как и в операциях сканирования таблиц (переменная record_buffer ).
Если для выполнения операции объединения требуется временная таблица, она создается как резидентная (тип tmp_table_size. После превышения этого предела таблица преобразуется в формат
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.