Я работаю на сайте сравнения пар, где пользователь загружает список фильмов и оценок с другого сайта.Затем мой сайт выбирает два случайных фильма и сравнивает их друг с другом, пользователь выбирает лучшее из двух, и загружается новая пара.Это дает полный список фильмов, упорядоченных в зависимости от того, что лучше.
База данных содержит три таблицы:
fm_film_data - содержит все импортированные фильмы
fm_film_data(id int(11),
imdb_id varchar(10),
tmdb_id varchar(10),
title varchar(255),
original_title varchar(255),
year year(4),
director text,
description text,
poster_url varchar(255))
fm_films - этосодержит всю информацию, относящуюся к пользователю, какие фильмы он просмотрел, какие оценки дал пользователь, а также информацию о выигрышах / проигрышах каждого фильма для этого пользователя.
fm_films(id int(11),
user_id int(11),
film_id int(11),
grade int(11),
wins int(11),
losses int(11))
fm_log - содержит записикаждой произошедшей дуэли.
fm_log(id int(11),
user_id int(11),
winner int(11),
loser int(11))
Чтобы выбрать пару для отображения пользователя, я создал запрос mySQL, который проверяет журнал и выбирает пару случайным образом.
SELECT pair.id1, pair.id2
FROM
(SELECT part1.id AS id1, part2.id AS id2
FROM fm_films AS part1, fm_films AS part2
WHERE part1.id <> part2.id
AND part1.user_id = [!!USERID!!]
AND part2.user_id = [!!USERID!!])
AS pair
LEFT JOIN
(SELECT winner AS id1, loser AS id2
FROM fm_log
WHERE fm_log.user_id = [!!USERID!!]
UNION
SELECT loser AS id1, winner AS id2
FROM fm_log
WHERE fm_log.user_id = [!!USERID!!])
AS log
ON pair.id1 = log.id1 AND pair.id2 = log.id2
WHERE log.id1 IS NULL
ORDER BY RAND()
LIMIT 1
Этот запрос занимает некоторое время для загрузки, около 6 секунд в наших тестах с двумя пользователями с примерно 800 оценками каждый.
Я ищу способ оптимизировать этот процесс, но все же ограничить показ всех дуэлей только один раз..
На сервере работает сообщество MySQL версии 5.0.90.