2013-03-22 4 views
1

Когда я тестирую этот запрос, он занимает около 17-20 секунд.Сколько времени допустимо для запуска запроса mySQL

UPDATE ex_hotel_temp 
SET specialoffer='1' 
WHERE hid IN 
    (SELECT hid 
    FROM ex_dates 
    WHERE offer_id IS NOT NULL 
     OR xfory_id IS NOT NULL 
     OR long_id IS NOT NULL 
     OR early_id IS NOT NULL 
    GROUP BY hid) 

Хотя это cronjob работает в ночное время, чтобы сделать некоторое домашнее хозяйство на базе (нет посетителя сайта сидит в ожидании результата), то мне кажется, что неприемлемая нагрузка на сервере. Правильно ли я, или я ни с кем не суетился?

Когда я запускаю каждый элемент запроса отдельно, он занимает около 0,001 секунды. Должен ли я поэтому разбить его на ряд простых запросов?

LATER EDIT: С помощью полученных комментариев и ответов я решил разделить запрос на два. В результате получается следующее:

$query_hotel = "SELECT hid FROM ex_dates WHERE offer_id IS NOT NULL OR xfory_id IS NOT NULL OR long_id IS NOT NULL OR early_id IS NOT NULL GROUP BY hid"; 
$hotel = mysql_query($query_hotel, $MySQL_XXX) or die(mysql_error()); 
$row_hotel = mysql_fetch_assoc($hotel); 
$totalRows_hotel = mysql_num_rows($hotel); 

$hid_array = array(); 
do { 
    array_push($hid_array,$row_hotel['hid']); 
}while ($row_hotel = mysql_fetch_assoc($hotel)) ; 
$hid_list = implode("','",$hid_array); 
$hid_list = "'$hid_list'"; 

// Mark the hotels as having a special offer 
$query_update = "UPDATE ex_hotel_temp SET specialoffer='1' WHERE hid IN ($hid_list)"; 
$result = mysql_query($query_update, $MySQL_XXX) or die(mysql_error()); 

Это некрасиво, но оно работает.

Как есть два запроса с небольшим количеством PHP, я не могу точно определить, сколько времени требуется для запуска, но просто глядя на время загрузки страницы, очевидно, намного ближе до доли секунды, чем 20 секунд.

Спасибо всем.

+1

Я бы предложил использовать соединение, отказавшись от 'GROUP BY' (здесь ничего не добавлено) и убедитесь, что есть индексы на' ex_hotel_temp.hid' и 'ex_dates.hid'. – eggyal

+0

Возможно, удалить 'GROUP BY hid' и перейти на' SELECT DISTINCT hid' – Justin

ответ

0

Вы говорите, что это работает на ночь в задании CRON, и вы говорите, что это поддерживает «сайт» - если это общедоступный веб-сайт, да, вы должны волноваться.

В межсетевом соединении нет таких вещей, как рабочие часы - посетители будут взаимодействовать с вашим сайтом, надеясь, что он захочет покупать вещи в любое время дня; даже «национальные» сайты, как правило, видят движение по ночам в моем опыте (хотя, как правило, только небольшая ставка по сравнению с пиковыми часами).

Возможно, что ваше задание CRON вызывает другие запросы, которые работают медленно - это зависит от того, что вызывает медленный запуск запроса, и используете ли вы транзакции. Проблема с веб-сайтами заключается в том, что пользователи становятся нетерпеливыми, когда сайт работает медленно, обновляя страницу, часто создавая больше трафика для базы данных, и если на сайте есть другие медленные запросы, не исключено, что сайт станет непригодным для использования в то время как даже с довольно ограниченным числом пользователей.

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

Другой причиной, по которой вы можете беспокоиться, является то, что по моему опыту производительность базы данных не является линейной - запросы не замедляются в линейной пропорции к количеству записей в вашей таблице. Вместо этого они, как правило, похожи на хоккейную клюшку - все в порядке, пока вы не достигнете переломного момента, и все остановится. Вы можете ехать на этой кривой хоккейной клюшки, и она может легко эскалации с 17-20 секунд до 17-20 минут.

Исправление выглядит просто - группа избыточна, а разделение запроса на более мелкие запросы должно помочь в подзапросе использовать индексы.

0

Мне все равно, просто убедитесь, что задание cron не таймаут на полпути через процессы. У меня лично был запрос в прошлом, а затем бежал за сервалами в работе cron без каких-либо проблем.

Смежные вопросы