оптимизация таблицы

Vadimka

Новичок
оптимизация таблицы

есть запрос, топ по кол-ву просмотров фотографий...
таблица просмотров содержит 1 млн записей,
запрос выполняется более 3 секунд
возможно ли его оптимизировать?

SELECT pv.id, count( * ) AS COUNT
FROM photo_album_fot_view pv, photo_album_fot pf
WHERE pv.id = pf.i
AND pv.idalbum = pf.idalbum
AND TO_DAYS( NOW( ) ) - TO_DAYS( pv.d8 ) <=1
GROUP BY 1
ORDER BY 2 DESC
LIMIT 4
 

Vadimka

Новичок
Кром да стоят конечно
п.с. а если тип поля pv.d8 с timestamp изменить на date ?
 

vadim

Guest
Проблема мне кажется здесь кроется:
WHERE pv.id = pf.i
AND pv.idalbum = pf.idalbum

Почему две таблицы сразу по двум полям соединяете?? Что в них??
 

alpes

Весь мир на ладони
Не хватает структур таблиц, остается гадать...
Что говорит explain?
Обрати внимание на TO_DAYS( pv.d8 ) <=1 - на каждую запись pv накладывается предварительное вычисление.
 

Vadimka

Новичок
alpes
таблица фотографий:
CREATE TABLE `photo_album_fot` (
`i` int(11) unsigned NOT NULL auto_increment,
`idalbum` smallint(6) NOT NULL default '0',
KEY `idalbum` (`idalbum`),
KEY `i_idalbum` (`i`,`idalbum`),
KEY `idalbum_i` (`idalbum`,`i`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=25995 ;
таблица просмотров фотографий:
CREATE TABLE `photo_album_fot_view` (
`id` int(11) NOT NULL default '0',
`idalbum` smallint(6) NOT NULL default '0',
`d8` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
`d9` date NOT NULL default '0000-00-00',
UNIQUE KEY `id+idalbum+ip` (`id`,`idalbum`,`ip`),
KEY `idalbum` (`idalbum`),
KEY `d8` (`d8`),
KEY `id+idalbum` (`id`,`idalbum`),
KEY `d9` (`d9`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;




id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE pf index idalbum,i_idalbum,idalbum_i,i i_idalbum 6 NULL 20821 Using index; Using temporary; Using filesort
1 SIMPLE pv ref id+idalbum+ip,idalbum,id+idalbum id+idalbum+ip 6 pf.i,pf.idalbum 36 Using where
 

kruglov

Новичок
> Using filesort
по чему сортируете-то? из изначального запроса не видно... не по цифре же 2?
 

Solid

Drosera anglica
Код:
FROM photo_album_fot_view AS pv
LEFT JOIN photo_album_fot AS pf USING(idalbum)
WHERE pv.id = pf.i
-~{}~ 03.05.06 13:50:

Не понятно с сортировкой. Зачем сортировать по 2?
 

alpes

Весь мир на ладони
1. полное "Г" в индексах, прям какое то дублирование idalbum везде и вся. Смотри ман по расстановке индексов.
2. как уже было замечено, в таком запросе индекс по полю d8 лишен смысла, т.к. над ним производится вычисление.
3. не понятен смысл в таблице photo_album_fot полностью дублированой в photo_album_fot_view
 

zerkms

TDD infected
Команда форума
alpes
как уже было замечено, в таком запросе индекс по полю d8 лишен смысла, т.к. над ним производится вычисление.
имхо это неверный подход. нужно не убирать индекс с поля, над которым производится вычисление, а попробовать это самое вычисление убрать, например сравнить таймстамп с интервалом (сегодня 00:00 - сегодня 23:59)
 

alpes

Весь мир на ладони
так никто и не говорит что индекс надо убирать, сделано замечание, остальное пусть сам исправляет
 
Сверху