Довідник з mysql

5.4.7. Відкриття і закриття таблиць в MySQL

Параметри table_cache. max_connections і max_tmp_tables задають максимальну кількість файлів, які сервер тримає відкритими. Якщо збільшити один або обидва цих параметра, то можна зіткнутися з обмеженням, що накладається цією операційною системою на кількість відкритих файлових дескрипторів для одного процесу. У багатьох системах, однак, цю межу можна збільшити. Оскільки способи зміни даного значення для різних систем можуть бути абсолютно різними, в кожному конкретному випадку вам слід звертатися до документації по своїй операційній системі.

Значення table_cache і max_connections взаємопов'язані. Наприклад, для 200 одночасно працюючих з'єднань необхідно мати кеш для таблиць розміром щонайменше 200 * n, де n - максимальна кількість пов'язаних таблиць. Необхідно також зарезервувати кілька додаткових файлових дескрипторів для тимчасових таблиць і файлів.

Слід упевнитися, що ваша операційна система здатна обробляти таку кількість відкритих файлових дескрипторів, яке передбачає дана установка table_cache. Якщо встановлюється занадто високе значення table_cache. то MySQL може вийти за межі допустимої кількості файлових дескрипторів, перервати з'єднання, не виконувати запити і стати вельми крихким. Необхідно також взяти до уваги, що для дескриптора таблиці MyISAM потрібно по два файлових дескриптора для кожної унікальної відкритої таблиці. Допустиме для MySQL кількість файлових дескрипторів можна збільшити за допомогою опції запуску --open-files-limit = # (see Розділ A.2.16, «Не знайдений файл (File not found)»).

Максимальна кількість таблиць в кеші відкритих таблиць дорівнюватиме кількості, зазначеній в table_cache (за замовчуванням - 64; це число можна змінити за допомогою опції -O table_cache = # для mysqld). Слід враховувати, що для виконання запитів MySQL може тимчасово відкрити і більше таблиць.

Невикористовувана таблиця закривається і видаляється з кешу таблиць в наступних ситуаціях:

Коли кеш заповнений і потік намагається відкрити таблицю, відсутню в цьому кеші.

Коли кеш містить більше, ніж table_cache вхідних величин, і потік більше не використовує таблицю.

Коли хто-небудь виконує mysqladmin refresh або mysqladmin flush-tables.

Коли хто-небудь виконує FLUSH TABLES.

Коли табличний кеш заповнюється, сервер використовує наступну процедуру розміщення вхідних даних кеша для їх використання:

Чи не використовуються в даний час таблиці звільняються в порядку найбільш давнього використання.

Якщо кеш заповнений і жодна таблиця не може бути вивільнена, а необхідно відкрити нову таблицю, то кеш тимчасово розширюється настільки, наскільки необхідно.

Якщо кеш знаходиться в тимчасово розширеному стані і таблиця переходить з використовуваного в неиспользуемое стан, то така таблиця закривається і звільняється з кешу.

Таблиця відкривається для кожного одночасного доступу. Це означає, що, якщо існують два потоки, які отримують доступ до однієї і тієї ж таблиці, або відбувається звернення до цієї таблиці двічі в одному і тому ж запиті (за допомогою AS), то дана таблиця повинна бути відкрита двічі. Для першого відкриття будь-якої таблиці потрібно два файлових дескриптора; для кожного додаткового використання - тільки один. Додатковий дескриптор для першого відкриття використовується для індексного файлу; цей дескриптор використовується спільно всіма потоками.

При відкритті таблиці командою HANDLER table_name OPEN створюється виділений табличний об'єкт для даного потоку. Цей табличний об'єкт недоступний для інших потоків і не буде закритий, поки даний потік не викличе команду HANDLER table_name CLOSE або сам потік не знищиться (see Розділ 6.4.2, «Синтаксис оператора HANDLER»). Якщо це станеться, то дана таблиця втягнений в кеш таблиць (якщо він не заповнений).

Щоб дізнатися, чи не занадто малий кеш таблиць, слід перевірити змінну Opened_tables. Якщо її значення досить велике, навіть якщо ви не виконували занадто часто команду FLUSH TABLES. то необхідно збільшити даний кеш таблиць (see Розділ 4.5.6.3, «SHOW STATUS»).

Схожі статті