Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Нетривиальная задачка: SELECT совмещённый с UPDATE / 8 сообщений из 8, страница 1 из 1
02.12.2004, 15:57
    #32810000
BiJi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нетривиальная задачка: SELECT совмещённый с UPDATE
Есть таблица, из которой на обработку несколько параллельно скриптов берут информацию. Для того чтобы скрипты не обрабатывали одни и теже данные на.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
$fsquery = 
"SELECT id, url
FROM chsites
WHERE (lastcheck < subdate(now(), interval 10 DAY)) OR (lastcheck IS NULL)
LIMIT 100";

if($rez = mysql_query($fsquery)) 
{
    while($row = mysql_fetch_assoc($rez))
    {
        $rows[] = $row;
        $upd[] = $row['id'];
     }
     $settry = "UPDATE chsites SET lastcheck = now() WHERE id in (".implode(',',$upd).")";
}
Скриптов очень много > 100
Можно-ли как либо уместить эту конструкцию в одном запросе. Или использовать другой алгоритм поскольку этот не устраивает по скорости.
При этом желательно не использовать LOCK дабы скрипты не выстраивались в очередь.
Заранее признателен за ответы.
...
Рейтинг: 0 / 0
02.12.2004, 16:23
    #32810081
Marat_L
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нетривиальная задачка: SELECT совмещённый с UPDATE
Зачем делать сложно, когда можно просто?
Код: plaintext
1.
2.
UPDATE chsites SET lastcheck = now()
WHERE (lastcheck < subdate(now(), interval  10  DAY)) OR (lastcheck IS NULL)
...
Рейтинг: 0 / 0
02.12.2004, 16:55
    #32810189
BiJi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нетривиальная задачка: SELECT совмещённый с UPDATE
Да, я думал об этом. Но как я смогу выбрать точно те данные которые проапдейтил, NOW() ведь измениться (запрос длиться > 1 секунды).
...
Рейтинг: 0 / 0
03.12.2004, 08:28
    #32810877
Marat_L
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нетривиальная задачка: SELECT совмещённый с UPDATE
Дык ты же все равно выбираешь с вычитанием 10 дней.
Из-за одной секунды ничего не произойдет.

Или ты еще где-то выбираешь?


Жизнь коротка - потерпи немного :)
...
Рейтинг: 0 / 0
03.12.2004, 11:04
    #32811214
BiJi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нетривиальная задачка: SELECT совмещённый с UPDATE
Да, там идёт сбор инфы. A поскольку её очень много и собрать её надо в минимальное время, задержки на выборку очень большие (на сетевые соеденения => загрузка процессора от 100 потоков ~10%) я запускаю огромное количество потоков.
...
Рейтинг: 0 / 0
03.12.2004, 11:25
    #32811302
Marat_L
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нетривиальная задачка: SELECT совмещённый с UPDATE
Ну если NOW() может отстать на секунду - ну сделай диапазон
Или я не понял :)

Жизнь коротка - потерпи немного :)
...
Рейтинг: 0 / 0
03.12.2004, 12:39
    #32811584
BiJi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нетривиальная задачка: SELECT совмещённый с UPDATE
Немного переформулирую постановку вопроса:
Ситуация:
Много скриптов в один момент времени могут запросить данные из таблици на обработку.
Условия:
Кол-во скриптов : > 100 (желательно чем больше - тем лучше).

Выборка порции происходит 1-3 сек.
Требования:

Выборка должна быть максимально распаралелена (оптимально 5 параллельных выборок).

Cкрипты недолжны брать на обработку одни и теже данные.

Скрипт не имеет постоянного соеденения с базой: ВЗЯЛ - ОТРАБОТАЛ - ПОЛОЖИЛ.
...
Рейтинг: 0 / 0
07.12.2004, 16:15
    #32816958
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нетривиальная задачка: SELECT совмещённый с UPDATE
>Cкрипты не должны брать на обработку одни и те же данные.
в противном случае всё летит к чертям собачьим?

ну если так, предлагаю сделать буфер для проверенных страниц; что-то типа create table buffer (id int not null, constraint unique (id)); сюда в рамках транзакции пишешь ид страниц (если повторение - генерится ошибка, пытаешься снова, в общем, геморроишься по полной программе), которые собираешься проверять, можно добавить поле с датой проверки (чтобы удалять проверенные, скажем, сутки назад, страницы). В основную таблицу предлагаю ввести дополнительное поле checkid - случайно (лучше - регулярно) генерящееся число, которым метишь записи со страницами, ид которых поместил в буфер, и уж потом по checkid выбираешь нужные страницы.

Второй способ:
1)помечаешь нужные страницы:
Код: plaintext
1.
UPDATE chsites SET checkid = $mychid
WHERE ((lastcheck < subdate(now(), interval  10  DAY)) OR (lastcheck IS NULL)) AND checkid= 0 ;
2)выбираешь их:
Код: plaintext
1.
SELECT id, url FROM chsites
WHERE checkid=$mychid LIMIT  100 ;
3)освобождаешь:
Код: plaintext
UPDATE chsites SET checkid= 0 , lastcheck=now() WHERE checkid=$mychid;
этот способ вроде поэкономней, checkid можно генерить случайно (остаётся мааааахонькая вероятность совпадения) или регулярно (уж придумаешь, как).


ma X mo
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Нетривиальная задачка: SELECT совмещённый с UPDATE / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]