Устранить сортировку файлов MySQL в запросе на обновление

У меня есть такая таблица, которую я использую, чтобы реализовать очередь в MySQL:

CREATE TABLE `queue` (`id` int (10) без знака NOT NULL AUTO_INCREMENT,
  `queue_name` varchar(255) NOT NULL,
  `вставлен` отметка времени NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `insert_by` varchar(255) НЕ ПУСТО,
  `приобретенная` метка времени NULL DEFAULT NULL,
  `got_by` varchar(255) DEFAULT NULL,
  `delayed_to` отметка времени NULL DEFAULT NULL,
  `priority` int(11) NOT NULL DEFAULT '0',
  текст `value` NOT NULL,
  `status` varchar(255) NOT NULL ПО УМОЛЧАНИЮ 'new',
  ПЕРВИЧНЫЙ КЛЮЧ (`id`),
  КЛЮЧ `queue_index` (` приобретенный`,`queue_name`,`priority`,`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

Моя проблема заключается в том, что MySQL использует файловую сортировку при запуске обновления. Выполнение очень медленное (5 с для 800k строк в таблице).

ОПИСАНИЕ ОБНОВЛЕНИЯ очереди SET SET = = "test" ГДЕ получено IS NULL И queue_name = "q1" ORDER BY по приоритету, id LIMIT 1;
+ ---- + ------------- + ------- + ------- + -------------- - + ------------- + --------- + ------------- + -------- + - ---------------------------- +
| id | select_type | стол | тип | возможные_ключи | ключ | key_len | ref         | строки | Extra                       |
+----+-------------+-------+-------+---------------+-------------+---------+-------------+--------+-----------------------------+
|  1 | ПРОСТО | очередь | диапазон | queue_index   | queue_index | 772     | const,const | 409367 | Используя где; Использование сортировки файлов |
+ ---- + ------------- + ------- + ------- + -------------- - + ------------- + --------- + ------------- + -------- + - ---------------------------- +

Что странно, когда я запускаю запрос SELECT с теми же условиями WHERE и ORDER, колонка файлов не используется:

ОПИСАНИЕ ВЫБРАТЬ идентификатор из очереди, ГДЕ получено значение НЕДЕЙСТВИТЕЛЬНО И имя-очереди = "q1" ORDER BY по приоритету, идентификатор LIMIT 1;
+ ---- + ------------- + ------- + ------ + --------------- + ------------- + --------- + ------------- + -------- + - ------------------------ +
| id | select_type | стол | тип | возможные_ключи | ключ | key_len | ref         | строки | Extra                    |
+----+-------------+-------+------+---------------+-------------+---------+-------------+--------+------------------------- +
| 1 | ПРОСТО | очередь | ref  | queue_index   | queue_index | 772     | const,const | 409367 | Используя где; Используя индекс |
+ ---- + ------------- + ------- + ------ + --------------- + ------------- + --------- + ------------- + -------- + - ------------------------ +

(Время запроса 0с)

Кто-нибудь знает, как избежать использования файловой сортировки в запросе на обновление или как увеличить ее производительность?

С уважением, Matzz

1 ответ

Решение

После обсуждения на форуме mysql ( http://forums.mysql.com/read.php?24,620908,620908) я сообщил об ошибке http://bugs.mysql.com/bug.php?id=74049 (что было проверено). Проблема может быть обойдена с помощью SELECT FOR UPDATE:

SET @update_id := -1;
SELECT (SELECT @update_id := id)
FROM queue
WHERE acquired IS NULL AND queue_name = "q1"
ORDER BY priority, id LIMIT 1;
FOR UPDATE;
UPDATE queue SET acquired = "test" WHERE id = @update_id;
Другие вопросы по тегам