|
|
|
| Задача такая: удалить из таблицы test_buf все строки, useragent которых включает в себя хотя бы одно значение из таблицы test_mas и при этом не является поисковым роботом.
<?php
$res = mysql_query("SELECT useragent FROM test_buf");
while($row = mysql_fetch_assoc($res))
{
$useragent = $row['useragent'];
$res1 = mysql_query("SELECT maska FROM test_mas ");
while($row1 = mysql_fetch_assoc($res1))
{
$maska = $row1['maska'];
$flag_maska = @strstr($useragent, $maska);
if ($flag_maska)
{
$flag_yandex = @strstr($useragent, "yandex");
$flag_Googl = @strstr($useragent, "Googl");
$flag_Rambler = @strstr($useragent, "Rambler");
$flag_Yahoo = @strstr($useragent, "Yahoo");
$flag_Mail = @strstr($useragent, "Mail");
$flag_Aport = @strstr($useragent, "Aport");
$flag_msnbot = @strstr($useragent, "msnbot");
if ((!$flag_yandex) and (!$flag_Googl) and (!$flag_Rambler) and (!$flag_Yahoo) and
(!$flag_Mail) and (!$flag_Aport) and (!$flag_msnbot) and ($useragent != "Bot"))
mysql_query("DELETE FROM test_buf WHERE useragent = '$useragent' ");
}
}
}
|
В таблице test_buf примерно 10 тысяч строк, а в таблице test_mas 20 строк. Не смотря на set_time_limit(500), страница выдает "504 Gateway Time-out" через 60 секунд.
Как можно решить эту задачу? | |
|
|
|
|
|
|
|
для: Владимир55
(20.05.2009 в 16:47)
| | это жестко конечно, 10,000 * 20 запросов к бд.
отпимизируйте скрипт или ставте бесконечное время. | |
|
|
|
|
|
|
|
для: Волки
(20.05.2009 в 16:51)
| | Бесконечное время не помогло (да и не могло помочь, ибо, как разъяснил трианон, база все равно отключается от рнр).
А как скрипт оптимизировать - в этом и весь вопрос! | |
|
|
|
|
|
|
|
для: Владимир55
(20.05.2009 в 16:55)
| | Быстрее всего разбить выборку на порции и запускать конвеером. Т.е. не за раз все 20 000 строк выбирать а по 2 000, например, и делать 10 запусков.
Или, если возможно, попытаться изменить структуру БД, чтобы исключить необходимость выполнения запросов в цикле. | |
|
|
|
|
|
|
|
для: Axxil
(20.05.2009 в 17:16)
| | может проще не записывать в базу эти значения? мы сначала анализ на робота делаем, а уже потом в базу пишем | |
|
|
|
|
|
|
|
для: GeorgeIV
(20.05.2009 в 17:42)
| | Я тоже так сделал. Но потребовалась администратовная обработка.
Вот я и думаю: может, перенести данные в два массива и обработать их в рнр?
Бвстрее будет? | |
|
|
|
|
|
|
|
для: Axxil
(20.05.2009 в 17:16)
| | "Быстрее всего разбить выборку на порции и запускать конвеером"
Вот этого я не сумел.
Как организовать порции?
Как обеспечить непрерывность отсутствие пропусков? | |
|
|
|
|
|
|
|
для: Владимир55
(20.05.2009 в 16:55)
| | >А как скрипт оптимизировать - в этом и весь вопрос!
Во-первых следует избавиться от вложенного в цикл запроса, если в таблице test_mas у вас всего 20 значений - не зачем их каждый раз извлекать - вытащите их за пределами цикла - поместите в массив и используйте массив, не выполняя на каждой из итераций дорогой по ресурсам SQL-запрос.
Во-вторых оператор DELETE следует вообще из всех циклов извлечь. В цикле формируйте WHERE-условие, а после цикла выполняйте DELETE запрос - лучше один большой DELETE-запрос, чем сотни мелких. | |
|
|
|
|
|
|
|
для: cheops
(21.05.2009 в 01:32)
| | Это очень интересно!
И это очень ценный совет!
Вы подсказали мне общие принцыпы оптимизации, которые можно распространить и на другие фрагменты кода, за что я Вам особенно благодарен! | |
|
|
|