У меня есть большая таблица под названием «очередь». Сейчас у него 12 миллионов записей.
CREATE TABLE `queue` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`userid` varchar(64) DEFAULT NULL,
`action` varchar(32) DEFAULT NULL,
`target` varchar(64) DEFAULT NULL,
`name` varchar(64) DEFAULT NULL,
`state` int(11) DEFAULT '0',
`timestamp` int(11) DEFAULT '0',
`errors` int(11) DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_unique` (`userid`,`action`,`target`),
KEY `idx_userid` (`userid`),
KEY `idx_state` (`state`)
) ENGINE=InnoDB;
Несколько воркеров PHP (150) используют эту таблицу одновременно.
Они выбирают запись, выполняют сетевой запрос с использованием выбранных данных, а затем удаляют запись.
Я получаю смешанные времена выполнения от запросов выбора и удаления. Команда удаления блокирует таблицу?
Что было бы лучшим подходом для этого сценария?
ВЫБЕРИТЕ запись + СЕТЕВОЙ запрос + УДАЛЕНИЕ записи
ВЫБЕРИТЕ запись + СЕТЕВОЙ запрос + ПОМЕТИТЬ запись как завершенную + УДАЛИТЬ завершенные записи, используя время от времени cron (мне не нужна еще большая таблица).
Примечание. Очередь получает новые записи каждую минуту, но запрос INSERT здесь не является проблемой.
Любая помощь приветствуется.