PHP - MySQL - большая база

S
На сайте с 28.01.2014
Offline
0
651

Приветствую.

Возникла диллема: пользователю с БД нужно при каждом обращении к скрипту выводить уникальные записи, но в случайном порядке. Т.е. вести сводную таблицу с учетом записей, которые пользователь уже просмотрел.

Как планирую:

1 таблица: список записей

2 таблица: связка пользователь-просмотренная_запис ь

При запросе к скрипту обращаюсь ко 2 таблице, вытягиваю список просмотренных пользователем записей, затем с первой таблицы вытягиваю случайно одну запись по условию "WHERE id NOT IN (список_просмотренных_записей) ORDER by RAND()".

Возникает 2 проблемы:

1. Таблица №2 со временем раздуется до миллионов записей и даже при небольших длинах самих строк будет долгая обработка запроса.

2. Список просмотренных записей у конкретного пользователя тоже может "распухнуть" до сотен тысяч номеров, что увеличит объем запроса в условии.

Понимаю, что должен быть более практичный вариант решения данной задачи. Буду благодарен за помощь.

P.S. Поиск юзал и не только здесь.

TitanIKS
На сайте с 25.01.2013
Offline
46
#1

ORDER by RAND() лучше не использовать при большой таблице

лучше использовать LIMIT

$rand = rand(0, $count);

LIMIT $rand, 1;

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

iqmaker
На сайте с 17.04.2012
Offline
342
#2

Если правильно понял, то вариант такой:

Имеем:

А - таблица товаров, большая

B - таблица просмотренных товаров

С - таблица выбранных случайных товаров для этого посетителя

Если таблица С пуста, заполняем ее случайными товарами из таблицы А которых нет в B,

При просмотре некоторого товара Т, добавляем его в таблицу B

При просмотре товара Т имеющегося в таблице С, удаляем его из нее.

Данные в вспомогательных таблицах пользователля хранить скажем не более 2 мес и 1000 шт.

Что-то проще в голову ничего не приходит

S
На сайте с 28.01.2014
Offline
0
#3

Понял, спасибо за идеи, буду пробовать.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий