SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 09.09.2011 15:02:16

andrei1975
Участник
Зарегистрирован: 09.09.2011
Сообщений: 3

Реально ли избавиться от filesort?

Есть 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"sad
Пробовал добавлять cdate в ключ uid_vote - не помогает. Когда поставил cdate на первое место в ключе, filesort вроде пропал, но я так понимаю перестал работать ключ для выборки по WHERE и пошел fullscan.
Есть ли решение, как избавиться от filesort и ускорить запрос? Если меня спасет разбивка на 2 запроса, тоже устроит.

Неактивен

 

#2 09.09.2011 15:29:23

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Реально ли избавиться от filesort?

Универсального способа нет: после IN у Вас уже RANGE, и сортировка будет
идти в памяти.

Можно попробовать сделать индекс по cdate (отдельный) и принудительно вы-
бирать по нему. Работать такой способ будет хорошо только в том случае, если
эти UID встречаются в этих максимальных датах. Если же прийдется просмотреть
половину таблицы, то он будет явно хуже сортировки в памяти.

Неактивен

 

#3 09.09.2011 16:25:09

andrei1975
Участник
Зарегистрирован: 09.09.2011
Сообщений: 3

Re: Реально ли избавиться от filesort?

В том то и дело, что гарантий что нужные мне UID будут где-то в свежих оценках никаких, более того, гипотетически, условие "uid IN (...)" может вообще вернуть пустой список.
Печальноsad

Неактивен

 

#4 09.09.2011 18:48:43

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Реально ли избавиться от filesort?

Выберите тогда сначала из одной таблички, а потом к готовым (и сортированным)
результатам присоединяйте вторую. Меньше объем для сортировки ⇒ быстрее ра-
ботает.

Неактивен

 

#5 10.09.2011 15:12:29

andrei1975
Участник
Зарегистрирован: 09.09.2011
Сообщений: 3

Re: Реально ли избавиться от filesort?

спасибо, попробую так и сделать

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson