Запрос с низким приоритетом в PHP или MySQL

#php #mysql #database-performance

#php #mysql #база данных-производительность

Вопрос:

У меня есть сайт и база данных с 5 миллионами строк, все работает как по маслу. Тем не менее, я запускаю cronjob очистки каждый час, чтобы поместить старые данные в таблицу «log» и удалить старые данные, и в это время ответ сервера очень медленный. Возможно ли присвоить этому заданию более низкий приоритет через PHP или MySQL?

Комментарии:

1. Что это за тип базы данных? MyISAM, InnoDB и т.д…

Ответ №1:

Я думаю, что самая сложная задача в вашей очистке — это операция УДАЛЕНИЯ, для которой вы можете использовать LOW_PRIORITY.

УДАЛИТЬ синтаксис из страницы руководства MySQL:

УДАЛИТЕ [LOW_PRIORITY] [QUICK] [IGNORE] ИЗ tbl_name …

и описание:

Если вы укажете LOW_PRIORITY, сервер задержит выполнение УДАЛЕНИЯ до тех пор, пока другие клиенты не начнут чтение из таблицы. Это влияет только на механизмы хранения, которые используют только блокировку на уровне таблицы (например, MyISAM, MEMORY и MERGE).

Ответ №2:

В MYSQL есть такая вещь, как низкоприоритетные обновления — это описано здесь -> http://dev.mysql.com/doc/refman/5.5/en/server-options.html#option_mysqld_low-priority-updates

** работает только для систем хранения MyISAM, MEMORY, MERGE….

Ответ №3:

Одним из возможных решений было бы копирование старых данных на подчиненный сервер репликации. Таким образом, большая нагрузка полностью ложится на этот подчиненный блок. Как только копирование будет завершено на подчиненном устройстве, вы можете удалить его на главном.

Ответ №4:

Как объясняется в документации, вы можете добавить LOW_PRIORITY в свой запрос. Таким образом, ваш запрос станет:

 $sql = "INSERT LOW_PRIORITY INTO #__bet_oddslog (id, team1, team2, league, sport, time, q1, q2)"; $sql .= " SELECT a.id, a.team1, a.team2, a.league, a.sport, a.time, AVG(b.q1) as q1, "; $sql .= " AVG(b.q2) as q2 FROM #__bet_details as a, #__bet_1x2_best as b WHERE time<'".date('Y-m-d H:i:s', strtotime("now"))."' AND a.id=b.bet_id GROUP BY b.bet_id";
  

Ответ №5:

Одним из запросов с низким приоритетом в MYSQL является задержка ВСТАВКИ. Но это работает только при вставке, а не при ОБНОВЛЕНИИ или удалении.

РЕДАКТИРОВАТЬ: я просто знал, что УДАЛЕНИЕ также может быть отложено!

Комментарии:

1. Это один из моих запросов: $sql = «ВСТАВИТЬ В #__bet_oddslog (идентификатор, team1, team2, лига, спорт, время, q1, q2)»; $sql .= » ВЫБРАТЬ a.id , a.team1, a.team2, a.league, a.sport, a.time, СРЕДНЕЕ значение (b.q1) как q1, «; $sql .= » СРЕДНЕЕ ЗНАЧЕНИЕ (b.q2) как q2 ИЗ #__bet_details как a, #__bet_1x2_best как b, ГДЕ time<‘».date(‘Y-m-d H: i:s’, strtotime(«сейчас»)).»‘ И a.id=b. группа bet_id По b.bet_id»; Также есть выбор, работает ли он в этом случае?

2. К сожалению, я считаю, что INSET DELAYED не работает для INSERT ... SELECT операторов.