InnoDB или механизм лока MyISAM

AT
На сайте с 27.11.2009
Offline
6
955

Есть таблица MyISAM, 3 млн записей.

Из таблицы делается выбор одной записи таким запросом

SELECT table.* FROM yaca

LEFT JOIN table2 ON table2.pid = table.id

WHERE isnull(table2.pid)

limit 0,1

сразу за получением строки делается запрос

INSERT INTO table2 (pid, update_id, state) и т.д.

затем получают некие данные из внешнего источника

и потом UPDATE table2 SET данные WHERE pid = pid тот что вставляли во втором запросе

Все это работает на парсере в цикле в режиме 200 запросов в минуту, а будет 500-600

Задача - перебрать всю таблицу и вставить соотв. данные во вторую таблицу.

Вроде должно работать так, что этот инсерт по идее, должен для следующей итерации выбирать следующую строку и так до победного, но фиг там, дублей по 5 штук :gm:

Скорость выполнения первого запроса мало отличается от обычного SELECT id FROM table LIMIT 0,1

Вопрос:

Блокируя в InnoDB строку, какие шансы конфликта при большой скорости запросов?

Есть какие-нибудь решения для MyISAM типа эмулятора лока строки?

N
На сайте с 06.05.2007
Offline
419
#1

Вопрос:
Блокируя в InnoDB строку, какие шансы конфликта при большой скорости запросов?

Ноль.


Есть какие-нибудь решения для MyISAM типа эмулятора лока строки?

Нет

вы не могли бы формулировать вопрос или описать, что вам нужно, а не рассказывать печальную историю ваших непонятных экспериментов?

Из кода кое-как понятно, что вам нужна раздача заданий параллельно работающим парсерам ЯК.

сделайте так :

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

дальше, учитывая размер таблицы, выгодно согнать пакет заданий в дополнительную табличку и уже по ней выбирать (помечать) задания по одному :

update ... set worker_pid=$pid, status=pending where order by ... limit 1; - эта пометка выполняется полностью атомарно в myisam. последующий выбор этой же записи :

select .. where worker_pid=$pid and status=pending order by ..limit 1;

Кнопка вызова админа ()
S
На сайте с 12.11.2009
Offline
13
#2

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий