Автор Тема: вложения в мускуле  (Прочитано 5277 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Uzver

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 47
  • +0/-0
  • 0
    • Просмотр профиля
вложения в мускуле
« : 01 Апреля 2008, 15:18:14 »
всем доброго дня
имеется запрос вида (возможно несколько громоздкий пример но суть думаю будет понятна):

SELECT * FROM `news`,`material` WHERE `news`.`materialID` = `material`.`materialID` and `news`.`newsDir` IN (SELECT `page`.`pageID` FROM `page`,`dir_page`,`dir`,`material` WHERE `dir`.`dirID` = \'11\' and `dir`.`dirID` = `dir_page`.`dirID` and `page`.`pageID` = `dir_page`.`pageID` and `dir_page`.`dirpPublish` = \'on\' and `page`.`materialID` = `material`.`materialID` and `material`.`materialPublish` = \'on\') ORDER by `news`.`newsDate` DESC

время выполнения запроса (при отключенном кешировании) порядка 2!!! секунд. в базе примерно 40 000 записей. тотже самый запрос но разбитый на два, тоесть сначала ОТДЕЛЬНО выполняем вложенный запрос а потом с его результатами выполняем основной, выполняется уже за десятые доли секунды. собственно вопрос, есть-ли другие пути чтобы получить тот-же самый результат одним запросом но при этом не ждать несколько секунд на его выполнение ?
В твоих руках все \"за\" и \"против\"
Тебе дарован меч судьбы.  Цену большую заплатив,  Ты жизнь не мыслишь без борьбы  За право \"быть\", а не \"казаться\",  И за собою жечь мосты.  Ты мир заставишь прогибаться,  Иначе ты - уже не ты!

Оффлайн ravshaniy

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 191
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
вложения в мускуле
« Ответ #1 : 02 Апреля 2008, 16:17:59 »
в подзапросе dir - не нужно вообще. и матириал используете дважды, нет необходимости. Отсюда подзапрос будет таким:

SELECT `page`.`pageID` FROM page
INNER JOIN dir_page ON page.`pageID` = `dir_page`.`pageID`
WHERE dir_page.dirID = \'11\'
  and `dir_page`.`dirpPublish` = \'on\'


ну а сам запрос нужно делать скорее так:
SELECT * FROM `news` n
INNER JOIN (
  SELECT `page`.`pageID` FROM page
    INNER JOIN dir_page ON page.`pageID` = `dir_page`.`pageID`
  WHERE dir_page.dirID = \'11\'
  and `dir_page`.`dirpPublish` = \'on\'
) pi ON n.newsDir = pi.pageID
INNER JOIN material m ON n.`materialID` = m.`materialID`
WHERE m.materialPublish` = \'on\'


Это как вариант но можно и по другому
убили кенни, сволочи

Оффлайн Uzver

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 47
  • +0/-0
  • 0
    • Просмотр профиля
вложения в мускуле
« Ответ #2 : 02 Апреля 2008, 16:36:24 »
спасибо, пошел искать учебники ((
В твоих руках все \"за\" и \"против\"
Тебе дарован меч судьбы.  Цену большую заплатив,  Ты жизнь не мыслишь без борьбы  За право \"быть\", а не \"казаться\",  И за собою жечь мосты.  Ты мир заставишь прогибаться,  Иначе ты - уже не ты!

Оффлайн ravshaniy

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 191
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
вложения в мускуле
« Ответ #3 : 02 Апреля 2008, 16:45:23 »
или может даже так
SELECT * FROM `news` n
INNER JOIN (
  SELECT `page`.`pageID` FROM page
    INNER JOIN dir_page ON page.`pageID` = `dir_page`.`pageID`
  WHERE dir_page.dirID = \'11\'
  and `dir_page`.`dirpPublish` = \'on\'
) pi ON n.newsDir = pi.pageID
INNER JOIN (
  SELECT * FROM material WHERE materialPublish = \'on\'
) m ON n.`materialID` = m.`materialID`


Так может быть выигрыш за счет того что таблица  material обрежется до иннер джоина

нужно смотреть план выполнения запроса
убили кенни, сволочи

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28