2016-08-05 5 views
0

У меня есть одна таблица с несколькими миллионами строк, hundres клиентов обращаются к этой таблице одновременно, каждый из них должен получить 20 уникальных строк, которые затем должны быть размещены последними в очереди.Предоставление уникальных результатов для нескольких клиентов одновременно

Моя установка:

Структура таблицы:

id | last_access | reserved_id | [Data columns] 
id + last_access is indexed 

Для выбора 20 уникальных строк, которые я использую следующее:

UPDATE "table" SET "reserved" = 'client-id_timestamp' WHERE "reserved" = ''ORDER BY "last_access" ASC LIMIT 20 

Этот запрос обновления довольно плохой производительности мудрый, который почему я спрашиваю:

Есть ли лучшее решение для моих конкретных требований? Возможно, другая структура таблицы?

+0

Использовать backtics вокруг имен столбцов, а не кавычек - кавычки для строк. –

+0

Это был всего лишь пример, но все равно отметил. – Jeppe

ответ

1

Действительно ли последний столбец даты? Попробуйте выразить его с помощью целочисленного значения (т. Е. Секунд с 1970-01-01), он может быть быстрее отсортирован.

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

Если вы используете MySQL 5.6.3 или новее, вы можете выполнить EXPLAIN с запросом, чтобы узнать, какая часть его занимает самое длинное.

+0

Фактически удаление индекса в столбце зарезервировано, исправлены некоторые проблемы с производительностью, поэтому спасибо за это! Я все еще думаю, что должно быть лучшее решение, как справиться с этим сценарием? Производительность ухудшается по мере увеличения количества строк. – Jeppe

+0

Возможно, вы могли бы написать, что вы пытаетесь сделать более подробно. Почему вы должны заказывать последний доступ? Зачем ограничивать 20? Возможно, это поможет помещать столбцы данных в отдельную таблицу и свести эту таблицу к минимуму. Вы также можете сохранить гораздо более короткую таблицу (100 тыс. Строк). Когда вы получаете доступ к объекту, вставьте/обновите его строку в эту таблицу «кеш» и создайте механизм обрезки, который удаляет старые записи за определенный промежуток времени. –

+0

Не переиндексации. Хотя было бы дорого обновить индекс, потому что вы меняете значение в индексе, было бы намного более дорогостоящим, чтобы переиндексировать всю таблицу. –

Смежные вопросы