Вопрос по распределению нагрузки на MySQL-сервер
Делал одному человеку скрипт, который выполняет около 7000 запросов типа SELECT и UPDATE к БД. И вот в один прекрасный день его хостер прислал к нему на почту письмо следующего содержания:
Большое количество обращений к базе данных с Вашего аккаунта вызвало перегрузку сервера, что привело к неработоспособности сайтов других клиентов.
Мы были вынуждены заблокировать работу сайтов.
Тоесть хостер просто заблокировал для него возможность подключения к БД.
Скрипты, которые выполняют описанные выше запросы, крайне важны для него, но вот такая хрень получается.
Как можно распределить нагрузку на сервер?
Я думал, что можно ввести интервал ожидания между каждым запросом к БД, но тут другая проблема: если так, то может просто не будет хватать времени для завершения работы скрипта! У них почему-то нельзя устанавливать set_time_limit() в скриптах, которые по крону выполняются.
Что мне делать?
Делал одному человеку скрипт, который выполняет около 7000 запросов типа SELECT и UPDATE к БД. И вот в один прекрасный день его хостер прислал к нему на почту письмо следующего содержания:
Тоесть хостер просто заблокировал для него возможность подключения к БД.
Скрипты, которые выполняют описанные выше запросы, крайне важны для него, но вот такая хрень получается.
Как можно распределить нагрузку на сервер?
Я думал, что можно ввести интервал ожидания между каждым запросом к БД, но тут другая проблема: если так, то может просто не будет хватать времени для завершения работы скрипта! У них почему-то нельзя устанавливать set_time_limit() в скриптах, которые по крону выполняются.
Что мне делать?
А причем здесь распеределение нагрузки?
Если для хостера подобная нагрузка непосильна - меняйте хостера.
Второй вариант - использование хранимых процедур (если конечно версия базы соотвествует)
третий вариант - ну выполняйте в одном скрипте по столько запросов, сколько не является критичным. запускайте их с интервалом в 10 минут например.
5 вариант - проверить скул запросы, правильность поднятых индексов, иногда хостеры могут кикнуть и из-за одного запроса )) проверить логику проекта - выборка по числу будет быстрее выборки по тексту и тд, т.е просмотреть максимально ли оптимизированна работа с базой
Хостера сменить не проблема. Только на какого?
Насчёт выполнять столько запросов, сколько он потянет: знаете что он ответил заказчику? Примерно в том смысле "Пусть все запросы будут выполняться в течении 1-й секунды".
Это вообще идиотизм открповенный со стороны хостера!!! Скрипт простой, и выполняется за то время, которое позволяет аппаратное обеспечение сервера. Упрощать его некуда. Если только разбить на части, или сделать интервал между выполнением запросов.
Но хостер, как я привел выше, вообще какой-то гон моему клиенту пишет...
Re to Fenyx
Ну а что может быть неоптимизированно в простом чтении поля через SELECT (даже без WHERE, а просто подряд) 1-го поля таблы, и изменении соотв-го поля в другой табле?
Ну проще некуда!!!
Re to squirL
Это уже не в моей компитенции. :)
Re to Fenyx
Ну а что может быть неоптимизированно в простом чтении поля через SELECT (даже без WHERE, а просто подряд) 1-го поля таблы, и изменении соотв-го поля в другой табле?
Ну проще некуда!!!
Что то совсем логики не понимаю такого подхода, ты берешь весь столбец и вгоняешь апдейтами в поле другой таблыцы?
Хостера сменить не проблема. Только на какого?
Насчёт выполнять столько запросов, сколько он потянет: знаете что он ответил заказчику? Примерно в том смысле "Пусть все запросы будут выполняться в течении 1-й секунды".
Это вообще идиотизм открповенный со стороны хостера!!! Скрипт простой, и выполняется за то время, которое позволяет аппаратное обеспечение сервера. Упрощать его некуда. Если только разбить на части, или сделать интервал между выполнением запросов.
Но хостер, как я привел выше, вообще какой-то гон моему клиенту пишет...
не зная конкретной ситуации посоветовать лично мне чтото тяжело. Но вобщето - 7000 запросов - вроде как и не слишьком много. Т.е. вероятно на любом нормальном хостинге, где используеться собственно распеределенная нагрузка проблем быть не должно. Спишись с несколькими - изложи свои требования и реши.
Re to Fenyx
Ну а что может быть неоптимизированно в простом чтении поля через SELECT (даже без WHERE, а просто подряд) 1-го поля таблы, и изменении соотв-го поля в другой табле?
Ну проще некуда!!!
ну во первых - индекс важен для поля которое читаеться - это обязательно. Поле которое апдейтеться - апдейт происходит по какомуто условию - т.е. оно тоже должно индексироваться. А само поле которое модифицируеться - недолжно в ходить в индекс. И вобще - подобные "элементарные" запросы - но построенные неграмотно вполне могут положить сервер. Поэтому возможно притензия хостера вполне обоснованна - не надо сразу лезть в бутылку - разбирайтесь, я думаю что это вполне решаемая проблема.
Вообще сейчас выясняется, что это не из-за скрипта, который по крону запускается, а из-за другого, который для ручного экспорта.
Там конечно уже не одно поле меняется в 1 или 0. И выполняется где-то минуты 3-5.
Ещё выеснилось, что заказчик его раз пять запускал в тот день, и ,как я предполагаю, каждый раз недождавшись завершения предыдущего.
В общем там конкретно сначала причину нужно найти, а потом её править... :confused: