Имеется таблица, помогающая проводить обработку заданий (более 300 млн. записей):
CREATE TABLE `test` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`job_id` int(10) unsigned NOT NULL,
`lock` mediumint(6) unsigned DEFAULT '0',
`time` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `job_id` (`job_id`),
KEY `lock` (`lock`),
KEY `time` (`time`),
KEY `lock_time` (`lock`,`time`)
) ENGINE=MyISAM;
в поле lock записывается 0 (при ожидании), ИД процесса (при выборке), 1 (при выполнении) и наконец снова 0.
в поле time записываться время выполнения задания.
Необходимо замкнуть цикл обработки заданий, в голову пришло ORDER BY `time` ASC LIMIT n.
123456 - process id
UPDATE `test` SET `lock` = 123456 WHERE `lock` = 0 ORDER BY `time` LIMIT 1000
SELECT * FROM `test` WHERE `lock` = 123456
UPDATE `test` SET `lock` = 1 WHERE `lock` = 123456
Под запрос UPDATE был создан ключ: KEY `lock_time` (`lock`,`time`)
Но почему то при выполнении EXPLAIN получается что используется только часть индекса `lock_time` а именно lock:
Хоть запрос выборки отрабатывает относительно быстро (0.0048 сек.):
SELECT SQL_NO_CACHE * FROM `test` WHERE `lock` = 0 ORDER BY `time` LIMIT 1000
Но аналогичный запрос UPDATE выпоняется недопустимо долго (286.0228 сек.):
UPDATE `test` SET `lock` = 123456 WHERE `lock` = 0 ORDER BY `time` LIMIT 1000
Жду ваших советов!