Spec-Zone .ru
спецификации, руководства, описания, API

8.4.3.1. Как MySQL Opens и Closes Tables

Когда Вы выполняете mysqladmin команду состояния, следует видеть что-то вроде этого:

Uptime: 426 Running threads: 1 Questions: 11082Reloads: 1 Open tables: 12

Open tables значение 12 может быть несколько озадачивающим, если у Вас есть только шесть таблиц.

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

table_open_cache и max_connections системные переменные влияют на максимальное количество файлов, которые сервер сохраняет открытым. Если Вы увеличиваетесь один или оба из этих значений, можно столкнуться с пределом, наложенным Вашей операционной системой на число для каждого процесса открытых дескрипторов файлов. Много операционных систем разрешают Вам увеличивать предел открытых файлов, хотя метод значительно различается от системы до системы. Консультируйтесь со своей документацией операционной системы, чтобы определить, возможно ли увеличить предел и как сделать так.

table_open_cache связывается с max_connections. Например, для 200 параллельных рабочих соединений, определите табличный размер кэша, по крайней мере, 200 * N, где N максимальное количество таблиц на, участвуют в любом из запросов, которые Вы выполняете. Следует также зарезервировать некоторые дополнительные дескрипторы файлов для временных таблиц и файлов.

Удостоверьтесь, что Ваша операционная система может обработать число открытых дескрипторов файлов, подразумеваемых table_open_cache установка. Если table_open_cache устанавливается слишком высоко, MySQL может исчерпать дескрипторы файлов и отказаться от соединений, быть не в состоянии выполнить запросы, и быть очень ненадежным. Также необходимо принять во внимание что MyISAM механизм хранения нуждается в двух дескрипторах файлов для каждой уникальной открытой таблицы. Можно увеличить число дескрипторов файлов, доступных MySQL, используя --open-files-limit опция запуска к mysqld. См. Раздел C.5.2.18, "'File'Не Найденные и Подобные Ошибки".

Кэш открытых таблиц сохраняется на уровне table_open_cache записи. Значение по умолчанию 400; это может быть изменено с --table_open_cache опция к mysqld. Отметьте, что MySQL может временно открыть больше таблиц чем это, чтобы выполнить запросы.

MySQL закрывает неиспользованную таблицу и удаляет ее из табличного кэша при следующих обстоятельствах:

Когда табличный кэш заполняется, сервер использует следующую процедуру, чтобы определить местоположение записи кэша в использование:

A MyISAM таблица открывается для каждого параллельного доступа. Это означает табличные потребности быть открытыми дважды, если два потока получают доступ к той же самой таблице или если поток получает доступ к таблице дважды в том же самом запросе (например, соединяя таблицу с собой). Каждый параллельный открытый требует записи в табличном кэше. Первый открытый из любого MyISAM таблица берет два дескрипторов файлов: один для файла данных и один для индексного файла. Каждое дополнительное использование таблицы берет только один дескриптор файла для файла данных. Дескриптор индексного файла совместно используется среди всех потоков.

Если Вы открываете таблицу с HANDLER tbl_name OPEN оператор, выделенный табличный объект выделяется для потока. Этот табличный объект не совместно используется другими потоками и не закрывается до вызовов потока HANDLER tbl_name CLOSE или поток завершается. Когда это происходит, таблица откладывается в табличном кэше (если кэш не полон). См. Раздел 13.2.4,"HANDLER Синтаксис".

Можно определить, является ли Ваш табличный кэш слишком маленьким, проверяя mysqld переменную состояния Opened_tables, который указывает на число открывающих таблицу операций начиная с запущенного сервера:

mysql> SHOW GLOBAL STATUS LIKE
        'Opened_tables';+---------------+-------+| Variable_name | Value |+---------------+-------+| Opened_tables | 2741  |+---------------+-------+

Если значение является очень большим или увеличивается быстро, даже когда Вы не выпустили многих FLUSH TABLES операторы, увеличьте табличный размер кэша. См. Раздел 5.1.4, "Системные Переменные Сервера", и Раздел 5.1.6, "Переменные Состояния Сервера".