8.4.3.1 Как MySQL открывает и закрывает таблицы
При выполнении команды mysqladmin status, вы должны увидеть что-то подобное:
Uptime: 426 Running threads: 1 Questions: 11082
Reloads: 1 Open tables: 12
Значение Open tables 12 может быть несколько непонятным, если у вас меньше 12 таблиц.
MySQL многопоточный, поэтому для данной таблицы может быть много клиентов, одновременно выполняющих запросы. Для минимизации проблемы с разными состояниями одних и тех же таблиц в сессиях разных клиентов, каждая конкурирующая сессия открывает таблицу независимо. Это использует дополнительную память, но обычно повышает производительность. С MyISAM таблицами для каждого клиента, открывшего таблицу, требуется один дополнительный дескриптор файла для файла данных. (В отличие от этого, дескриптор файла индекса разделяется между всеми сессиями).
Системные переменные table_open_cache и max_connections влияют на максимальное количество файлов, которые сервер может держать открытыми. Если вы увеличите одно или оба этих значения, вы можете столкнуться с ограничением, наложенным вашей операционной системой на количество открытых дескрипторов файлов на процесс. Многие операционные системы позволяют увеличить предел на количество открытых файлов, хотя метод сильно различается в зависимости от системы. Обратитесь к документации вашей операционной системы, чтобы определить, можно ли увеличить этот предел и как это сделать.
table_open_cache связана с max_connections. Например, для 200 одновременно работающих подключений укажите размер кэша таблиц как минимум 200 *
, где NN — максимальное количество таблиц на соединение в любом из выполняемых запросов. Вы также должны зарезервировать дополнительные дескрипторы файлов для временных таблиц и файлов.
Убедитесь, что ваша операционная система может обработать количество открытых дескрипторов файлов, подразумеваемое настройкой table_open_cache. Если table_open_cache установлено слишком большим значением, MySQL может исчерпать дескрипторы файлов и проявить симптомы, такие как отказ от подключений или невозможность выполнения запросов.
Также учтите, что хранилище MyISAM требует двух дескрипторов файлов для каждой уникальной открытой таблицы. Для разбиеной MyISAM таблицы требуются два дескриптора файлов для каждого раздела открытой таблицы. (Когда MyISAM открывает разбиение таблицы, он открывает каждый раздел этой таблицы, независимо от того, используется ли данный раздел на самом деле. См. MyISAM и использование дескрипторов файлов разделов.) Чтобы увеличить количество дескрипторов файлов, доступных MySQL, установите системную переменную open_files_limit. См. Раздел B.3.2.16, «Ошибка «Файл не найден» и похожие ошибки».
Кэш открытых таблиц поддерживается на уровне table_open_cache записей. Сервер автоматически настраивает размер кэша при запуске. Чтобы явно установить размер, установите системную переменную table_open_cache при запуске. MySQL может временно открыть больше таблиц, чем это, для выполнения запросов, как описано позже в этом разделе.
MySQL закрывает неиспользуемую таблицу и удаляет её из кэша таблиц в следующих случаях:
Когда кэш заполнен, и поток пытается открыть таблицу, которая не находится в кэше.
Когда кэш содержит более
table_open_cacheзаписей, и таблица в кэше больше не используется ни одним потоком.Когда происходит операция сброса таблицы. Это происходит, когда кто-то выдает утверждение
FLUSH TABLESили выполняет команду mysqladmin flush-tables или mysqladmin refresh.
Когда кэш таблиц заполняется, сервер использует следующую процедуру для поиска записи кэша для использования:
Таблицы, которые в данный момент не используются, освобождаются, начиная с таблицы, наименее недавно использовавшейся.
Если новая таблица должна быть открыта, но кэш заполнен, и ни одна таблица не может быть освобождена, кэш временно расширяется по мере необходимости. Когда кэш находится в состоянии временного расширения, и таблица переходит из состояния использования в состояние неупотребления, таблица закрывается и освобождается из кэша.
Для каждого одновременного доступа открывается таблица MyISAM. Это означает, что таблицу нужно открыть дважды, если два потока обращаются к одной и той же таблице или если поток обращается к таблице дважды в одном запросе (например, при объединении таблицы с собой). Каждый одновременный запрос требует записи в кэш таблиц. Первый запрос любой MyISAM таблицы занимает два дескриптора файлов: один для файла данных и один для файла индекса. Каждое последующее использование таблицы занимает только один дескриптор файла для файла данных. Дескриптор файла индекса разделяется между всеми потоками.
Если вы открываете таблицу с помощью оператора HANDLER
, для потока выделяется отдельный объект таблицы. Этот объект таблицы не разделяется другими потоками и не закрывается до тех пор, пока поток не выполнит tbl_name OPENHANDLER
или не завершит работу. В этом случае таблица возвращается в кэш таблиц (если кэш не заполнен). См. Раздел 13.2.4, «Оператор HANDLER».tbl_name CLOSE
Чтобы определить, слишком ли мал ваш кэш таблиц, проверьте системную переменную состояния Opened_tables, которая указывает количество операций открытия таблиц с момента запуска сервера:
mysql> SHOW GLOBAL STATUS LIKE 'Opened_tables';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Opened_tables | 2741 |
+---------------+-------+
Если значение очень велико или увеличивается быстро, даже если вы не выполняли много операторов FLUSH
TABLES, увеличьте значение table_open_cache при запуске сервера.
© 2025 Oracle
Licensed under the GPLv2 License.