Spec-Zone.ru › MySQL 9.2

10.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 * N, где N - максимальное количество таблиц на объединение в любом из выполняемых вами запросов. Вы также должны зарезервировать несколько дополнительных дескрипторов файлов для временных таблиц и файлов.

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

Также учитывайте, что для хранилища 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 OPEN, то для потока выделяется выделенный объект таблицы. Этот объект таблицы не разделяются другими потоками и не закрывается, пока поток не вызовет HANDLER tbl_name CLOSE или поток не завершится. Когда это происходит, таблица возвращается в кэш таблиц (если кэш не заполнен). См. Раздел 15.2.5, «Оператор HANDLER».

Чтобы определить, слишком ли мал кэш таблиц, проверьте системную переменную состояния 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.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/table-cache.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API