- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
В 2023 году Google заблокировал более 170 млн фальшивых отзывов на Картах
Это на 45% больше, чем в 2022 году
Оксана Мамчуева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
вопрос есть некая база пользователей с таблицей в которой более 100000 строк (пользователей), каждая строка проверяется ежечасно неким скриптом на активность в последний час и если был активен то в колонке "activ" ставится "1" если нет то "0", ну это по идее на самом деле есть только масив активных поэтому делаю так:
mysql_query($query) or die ("Error in query: $query");
//$good - masiv so vsemi aktivnymi s proverki
foreach ($good as $id){
$query = "UPDATE users SET `activ` = '1' WHERE `username` = '$id'";
mysql_query($query) or die ("Error in query: $query");
}
получается что в момент проверки таблица обнуляется, у всех проставляю в "activ" 0, а потом из масива полученног с проверки всех активных проставляются "1" в "activ" т.е фактически есть пару минут когда в базе активных пользователей 0 и это значение постепенно растет до момента проставления всех "1" в колонке "activ".
как избежать ситуации с нулевым показателем активных пользователей в эти пару минут пока проставляются "1" в колонке "activ"???
пробывал сделать так:
$query = "UPDATE users SET `activ` = '1' WHERE `username` = '$id'";
mysql_query($query) or die ("Error in query: $query");
}
foreach ($good as $id){
$query = "UPDATE users SET `activ` = '0' WHERE `username` <> '$id'";
mysql_query($query) or die ("Error in query: $query");
}
но чтото не пошло у всех проставились "0" в "activ" в конце исполнения.
прошу сильно не пинать )) можно с кошельком в ЛС за вознаграждение.
спасибо.
как избежать ситуации с нулевым показателем активных пользователей в эти пару минут пока проставляются "1" в колонке "activ"???
Пара минут?
Каким образом проверяется? Откуда массив good?
siv1987, сложно объяснять происодит ряд подключений к сторонним серверам, но может не пару но минуту точно и это после переезда на дедик, на впс реально занимало минуты 2-3
вот код проверки:
функция multicurlcheck своя производит саму проверку:
$cnt = count( $all_users) / 500;
for( $i = 0; $i < $cnt; $i++ )
$good = array_merge( $good, multicurlcheck( $location, array_slice( $all_users, $i * 500, 500 ), 10 ) );
Сколько пользователей обычно онлайн? Может есть смысл разбить на подгруппы и делать IN-ом в несколько запросов?
siv1987, обычно около 1-2% активных но разных, всетаки склоняюсь к решению моему второму :
$query = "UPDATE users SET `activ` = '1' WHERE `username` = '$id'";
mysql_query($query) or die ("Error in query: $query");
}
foreach ($good as $id){
$query = "UPDATE users SET `activ` = '0' WHERE `username` <> '$id'";
mysql_query($query) or die ("Error in query: $query");
}
но почемуто проставляются "0" в актив, не страшно если какоето время в базе будут активные с прошлой и с текущей проверки вместе, а в течении 1-2 минут проставятся нули у неактивных по последней проверки, страшнее когда в базе у всех "0" в активе а потом по возрастающей.
не обязательно обнулять всех. обнулить надо только тех, у кого был activ=1. может быть это будет быстрее чем пробегать по всем строкам и сравнивать id с активным.
не обязательно обнулять всех. обнулить надо только тех, у кого был activ=1. может быть это будет быстрее чем пробегать по всем строкам и сравнивать id с активным.
Mysql все равно будет изменять только те значения которые не ноль, так что тут имхо может быть без разницы.
страшнее когда в базе у всех "0" в активе а потом по возрастающей.
Покажите ради интереса структуру таблицы.
И хорошо было бы увидеть профилинг запроса UPDATE users SET `activ` = 0;
---------- Добавлено 11.06.2013 в 22:32 ----------
всетаки склоняюсь к решению моему втором
не обязательно обнулять всех. обнулить надо только тех, у кого был activ=1. может быть это будет быстрее чем пробегать по всем строкам и сравнивать id с активным.
тормоз не на
$query = "UPDATE users SET `activ` = '1' WHERE `username` = '$id'";
mysql_query($query) or die ("Error in query: $query");
}
т.е пока пробежит по всей базе и проставит "1" у всех кто из масива $good
Структуру таблицы ждем в студию.
Еще как вариант создать временную таблицу, загнать туда данные и сравнивать с ней.
siv1987, вот структура если это вы имели ввиду:
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(20) DEFAULT NULL,
`active` varchar(10) DEFAULT NULL,
UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=100568;
Без индекса на username... 100K записей... Зачем так жить?!
Индекс запилите, вы же видите что поиск происходит по этому поле, и несколькими тысяч запросов сразу. Не удивительно тогда что скрипт отрабатывает по несколько минут.
100K строк и автоинкремент на 40K, это как?
Почему UNIQUE а не PRIMARY?