SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 17.01.2009 07:30:55

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Как бы ускорить запрос

Запрос работает быстро однако постоянно в slow query log лезет sad
Очень долго думал, но никак не придумал, прошу помощи.

SELECT coment.id,coment.author,coment.date,coment.text,photo.aid,photo.pid,photo.apid
FROM `photo`.`coment`,`photo`.`photo`
WHERE gid=3 AND coment.pid=photo.apid ORDER BY coment.date DESC
 


EXPLAIN почему то как на 2 запроса:

1      SIMPLE      coment      ALL      pid      NULL      NULL      NULL      230      Using filesort
1     SIMPLE     photo     eq_ref     PRIMARY,gid,gid_2,gid_3     PRIMARY     4     photo-group.coment.pid     1     Using where

не понимаю почему не цепляет индексы, таблицы сами таковы:


CREATE TABLE `coment` (
  `id` int(10) NOT NULL auto_increment,
  `pid` int(10) NOT NULL,
  `author` int(4) NOT NULL,
  `text` text NOT NULL,
  `date` datetime NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `pid` (`pid`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251
 



CREATE TABLE `photo` (
  `gid` int(4) NOT NULL COMMENT 'Номер группы, где фотка',
  `apid` int(8) NOT NULL auto_increment,
  `pid` int(4) NOT NULL,
  `aid` int(4) NOT NULL,
  `zid` int(4) NOT NULL,
  `author` varchar(50) default NULL,
  `name` varchar(50) default NULL,
  `desc` varchar(255) default NULL,
  `date` datetime NOT NULL,
  `editdate` datetime default NULL,
  `view` int(10) default '0',
  `file` varchar(50) NOT NULL,
  `exif_ss` varchar(10) NOT NULL,
  `exif_vdr` varchar(10) NOT NULL,
  `exif_iso` int(4) NOT NULL,
  `exif_camera` varchar(20) NOT NULL,
  `exif_cameramodel` varchar(50) NOT NULL,
  `exif_time` datetime NOT NULL,
  `exif_width` int(4) NOT NULL,
  `exif_height` int(4) NOT NULL,
  `mfdraw` enum('da','net') NOT NULL,
  `coment` int(8) NOT NULL,
  PRIMARY KEY  (`apid`),
  KEY `gid` (`gid`,`apid`,`aid`),
  KEY `name` (`name`,`desc`,`date`,`editdate`,`view`,`file`),
  KEY `gid_2` (`gid`,`pid`,`aid`,`zid`,`file`),
  KEY `gid_3` (`gid`,`aid`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251
 


Ещё "страшный" момент в том, что для того чтобы вывести комментарии автоматом деля их по 20 на страницу, функция "paginator'a" требует как входной параметр общее количество элементов и соотв. запрос тоже падает в SLOW QUERY LOG:

SELECT COUNT(id) as total FROM `photo-group`.`coment`,`photo-group`.`photo` WHERE gid=3 AND coment.pid=photo.apid


Собственно что не так? Думаю уже пару дней, решил обратится к вам. Заранее спасибо.

Отредактированно Proger (17.01.2009 07:35:00)

Неактивен

 

#2 19.01.2009 14:13:10

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

Re: Как бы ускорить запрос

1. Если попадает в slow query log - значит, не быстро smile
2. Ключики у Вас странные, поэтому не используются.
3. Запрос у Вас представляет логически два запроса: "выбрать фотографии из данной группы" и
"выбрать комментарии к фотографиям" - поэтому работает долго. Гораздо лучше разбить на два
запроса.
4. Ну и на coment ключик нужен на (pid, `DATE`) - Вы же сортируете по нему.

Неактивен

 

#3 20.01.2009 00:41:53

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: Как бы ускорить запрос

1. Ну время то небольшое smile

2. Документацию по составлению ключей в сети не найти нормальную.

3. Гм. То есть выбор номеров нужных фотографий, а потом выбор комментариев IN (номера фоток списком) ?
Думаю наверное придёться просто в таблицу комментариев сделать ещё поле где отмечено в какой группе фотка, иначе сложно слишком получаются запросы. Или такой как у меня или JOIN или 2 с неимоверным по длине IN. Ведь допустим у меня в фотоальбоме 4196 фотографий, IN будет весёлым...

4. Понял smile)

Спасибо за ответы, радует что помогаете, много где подобные темы игнорят просто.



ADD 6:20
Почему такие кривые индексы: мой мозг испоганил один форум где мне сказали что в индексе должно быть то что ты выбираешь, а не условия выборки. Потом поправили что в индексе должны быть данные которые ты выбираешь и условия выборки
Благодаря вашему же совету у меня получилось выкинуть всё из slow query log'a и пока туда вроде ничего не падает. Ещё конечно проверяю - улучшаю, но уже очень радует!!!

Отредактированно Proger (20.01.2009 06:22:51)

Неактивен

 

#4 20.01.2009 13:42:11

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

Re: Как бы ускорить запрос

Я просто думаю, что если у Вас 4096 фотографий в категории - Вам вряд ли понадобятся все комментарии
сразу ото всех. Скорее, Вам понадобится что-то типа "последний комментарий от каждой из 50 фотографий
на этой странице". Ну и "50 следующих комментариев к этой фотографии". smile

Неактивен

 

#5 21.01.2009 03:03:49

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: Как бы ускорить запрос

Я в итоге добавил поле gid и стало в разы проще.

Нашел ещё кучу ляпов с индексами где в индексах извлекаемые данные вместе с условием и нет условий сортировки. Кароче сижу клепаю индексы щаз.

Я выбираю так называемую "ленту комментариев" то есть ВСЕ комментарии ко ВСЕМ фоткам во ВСЕХ категориях, которые загрузил какой-то юзер и отсортированы по дате, чтобы сразу глядеть новые коменты.

Неактивен

 

#6 21.01.2009 12:42:55

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

Re: Как бы ускорить запрос

Есть ощущение, что даже в ленте все комментарии не нужны. Нужно "последние 100".

Неактивен

 

#7 22.01.2009 03:02:10

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: Как бы ускорить запрос

ммм в ленте обычно дают возможно листать скажем по 50 / 100 коментов за всю историю существования аккаунта. Всё равно же все коменты хранятся, дык почему бы лишний раз не показать? smile

add: последние 100 и никаких старше это если в RSS выгружать.

Отредактированно Proger (22.01.2009 09:08:40)

Неактивен

 

#8 22.01.2009 16:06:08

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

Re: Как бы ускорить запрос

Да, но выводить Вы же будете все равно постранично, даже не в RSS. Ну, в любом случае, уже началось
какое-то не конструктивное обсуждение smile

Неактивен

 

Board footer

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