mySQL блокировка таблиц.
Есть таблица, в которую все время что-то пишут (иногда более 50 раз в секунду). Естественно размер быстро растет.
Ежедневно, точнее еженочно, старые записи из талицы удаляются. Удаление занимает некоторое время, на которое таблица блокируется для записи. Все пишущие клиенты выстраиваются в очередь, и через пару секунд мы получаем To many connections.
Удаление ни как не затрагивает добавляемые записи, нельзя ли как-то ускорить удаление, или сделать так, чтобы таблица не блокировалась.
P.S. На другой SQL сервер переходить не предлагать, и без вас знаю.
[ Это Сообщение было отредактировано mike в 2002-01-05 1444 ]
On 2002-01-05 1444, mike wrote
Тут такая проблема
Есть таблица, в которую все время что-то пишут (иногда более 50 раз в секунду). Естественно размер быстро растет.
Ежедневно, точнее еженочно, старые записи из талицы удаляются. Удаление занимает некоторое время, на которое таблица блокируется для записи. Все пишущие клиенты выстраиваются в очередь, и через пару секунд мы получаем To many connections.
Удаление ни как не затрагивает добавляемые записи, нельзя ли как-то ускорить удаление, или сделать так, чтобы таблица не блокировалась.
P.S. На другой SQL сервер переходить не предлагать, и без вас знаю.
Жаль, последняя фраза удерживает меня от первой мысли, пришедшей мне в голову
Если уж нужен именно MySQL то можно попытаться предложить следующие пути решения
1. Производить удаление почаще (например раз в час). Тогда время, затрачиваемое на него будет значительно меньше и сократит риск подобной ситуации.
2. Если первый вариант почему-либо не подходит (а я предполагаю что это возможно), то можно предложить несколько более извращенный вариант, который, однако, должен сработать. Допустим твоя таблица называется LOG.
- делаешь дополнительно 2 таблицы. Одна из них - полная копия (по структуре) той таблицы в которую ты так интенсивно пишешь (назовем ее SHADOW). Вторая - всего лишь одна строчка (назовем ее CONFIG).
- вводишь понятие "активной таблицы", имя которой будет храниться у тебя в таблице CONFIG (той, которая из одной строчки). Любой, кто захочет записать что-то в таблицу, должен будет сначала взать имя "активной" таблицы из таблицы CONFIG и использовать его при создании запроса.
- Процесс, занимающийся удалением информации из таблицы делает это в 5 этапов
1. UPDATE CONFIG SET ACTIVE_TABLE='SHADOW'
2. DELETE FROM LOG WHERE ....
3. UPDATE CONFIG SET ACTIVE_TABLE='LOG'
4. <перенос данных из SHADOW в LOG>
5. DELETE FROM SHADOW
Должно работать. Хотя и появляется дополнительный запрос, но время его выполнения ничтожно, так что на общей производительности системы не скажется.
P.S. Хех, и на какие извращения идут люди, продолжная тем не менее упорно использовать это жалкое подобие нормального SQL сервера...