Устранить сортировку файлов 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;