Задавайте вопросы, мы ответим
Вы не зашли.
Есть 3 таблички, users, films и filmvotes.
В users ~40К записей, в films ~20К, в filmvotes ~700К.
CREATE TABLE `films` (
`fid` mediumint(8) unsigned NOT NULL auto_increment,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`fid`)
) ENGINE=MyISAM;
CREATE TABLE `users` (
`uid` mediumint(9) NOT NULL auto_increment,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`uid`)
) ENGINE=MyISAM;
CREATE TABLE `filmvotes` (
`fid` mediumint(8) NOT NULL,
`uid` mediumint(9) NOT NULL,
`vote` tinyint(4) NOT NULL default '0',
`cdate` datetime NOT NULL,
PRIMARY KEY (`filmID`,`uid`),
KEY `uid_vote` (`uid`,`vote`)
) ENGINE=MyISAM;
Задача, выбрать для группы юзеров (то есть имеем массив значений для uid) свежие(ненулевые) 20 оценок фильмов.
Запрос:
SELECT filmvotes.fid,films.name AS filmname,filmvotes.vote,filmvotes.uid,filmvotes.cdate
FROM filmvotes, films
WHERE filmvotes.uid IN (1,2,3,4....,X) AND filmvotes.vote > 0 AND filmvotes.fid=films.fid
ORDER BY filmvotes.cdate DESC
LIMIT 20;
Explain говорит, что "Using where; Using filesort"
Пробовал добавлять cdate в ключ uid_vote - не помогает. Когда поставил cdate на первое место в ключе, filesort вроде пропал, но я так понимаю перестал работать ключ для выборки по WHERE и пошел fullscan.
Есть ли решение, как избавиться от filesort и ускорить запрос? Если меня спасет разбивка на 2 запроса, тоже устроит.
Неактивен
Универсального способа нет: после IN у Вас уже RANGE, и сортировка будет
идти в памяти.
Можно попробовать сделать индекс по cdate (отдельный) и принудительно вы-
бирать по нему. Работать такой способ будет хорошо только в том случае, если
эти UID встречаются в этих максимальных датах. Если же прийдется просмотреть
половину таблицы, то он будет явно хуже сортировки в памяти.
Неактивен
В том то и дело, что гарантий что нужные мне UID будут где-то в свежих оценках никаких, более того, гипотетически, условие "uid IN (...)" может вообще вернуть пустой список.
Печально
Неактивен
Выберите тогда сначала из одной таблички, а потом к готовым (и сортированным)
результатам присоединяйте вторую. Меньше объем для сортировки ⇒ быстрее ра-
ботает.
Неактивен
спасибо, попробую так и сделать
Неактивен