Как вы планируете удалять вещи из таблицы позже? Вам может понадобиться добавить еще один индекс, чтобы это работало эффективно.
Если вам нужны только последние 5 посещений, я бы денормализовал таблицу (сохраняет пространство, индексировал и использовал только один поиск первичного ключа), и в процессе мне больше не пришлось бы беспокоиться об удалении старых данных. Каждый пользователь будет занимать только одну строку в таблице, поэтому он не будет сильно расти со временем. Итак:
CREATE TABLE user_visitors (user_id int primary key,
visitor_1_id int,
visitor_1_time timestamp,
..
visitor_5_id int,
visitor_5_time timestamp);
Чтобы сохранить посещение, вы должны вставить новую строку с посетителем_1 в качестве посетителя. Для дубликатов вы сдвинете вниз ранее сохраненные значения:
INSERT INTO user_visitors SET ...
... ON DUPLICATE KEY UPDATE visitor_5_id = visitor_4_id, visitor_5_time = visitor_4_time ...
... visitor_1_id = ?, visitor_1_time = ?
Если вы беспокоитесь о дубликатах, вы можете решить их, добавив IF в раздел UPDATE, чтобы строка не обновлялась, если visitor_id уже присутствует в строке. В коде вы можете проверить наличие обновленного количества строк. Если ноль, обработайте двойное обновление времени посетителя оттуда. Это включает в себя некоторую работу, но это будет быстро и легко понять.