Помогите с большим вложенным запросом. Или как лучше.

KRAIN32

Вот такой запрос просто умирает когда выплнятеся. от 30 секунд и более..Что не так...r_dict - таблица словr_dict.iddict - уникальный номерr_dict.word - слово (индекс)r_ipage - таблица страницr_ipage.idpage - уникальный №r_pdic - связь r_ipage и r_dictr_pdic.iddict - код из r_dictr_pdic.idpage - код из r_ipageпри разных кол-во вложенный циклов (поиск фраз может быть бесконечным)идея заключалась в том чтобы при первом запросе 'китай'выбрались ксе уникальные r_pdic.idpage (группированные)следующий запрос 'погрузчик'проходил поиск по таблице результатовследующий запрос 'фронтальный'проходил поиск по таблице результатовПримерr_pdic.idpage, r_pdic.iddict1, 21, 21, 31, 22, 22, 11, 21, 22, 22, 21, 1если r_pdic.iddict, r_pdic.word1, погрузчик2, фронтальный3, китайдолжно вывести:1
select * from r_ipage
where 
idpage IN 
(

 select SQL_CACHE idpage
 from r_pdic
 where
 r_pdic.iddict = (select iddict from r_dict where `word` = 'фронтальный')
 
 and
 r_pdic.idpage IN
 ( 
 select SQL_CACHE idpage 
 from r_pdic 
 where 
 r_pdic.iddict = (select iddict from r_dict where `word` = 'погрузчик')

 and
 r_pdic.idpage IN
 ( 
 select SQL_CACHE idpage 
 from r_pdic 
 where 
 r_pdic.iddict = (select iddict from r_dict where `word` = 'китай')
)
)
)
 LIMIT <b>50</b>
10 ответов

KRAIN32

Примерr_pdic.idpage, r_pdic.iddict1, 21, 21, 31, 22, 22, 11, 21, 22, 22, 21, 1если r_pdic.iddict, r_pdic.word1, погрузчик2, фронтальный3, китайдолжно вывести:1
вторая таблица наверно не r_pdic, а r_dict, могу предложить на выбор
select r_pdic.idpage from r_pdic,r_dict where r_pdic.iddict=r_dict.iddict and
 ( r_dict.word='китай' or r_dict.word='погрузчик' or r_dict.word='фронтальный')
 group by r_pdic.idpage having count(distinct r_pdic.iddict)=<b>3</b>

select r_pdic.idpage from r_pdic, r_dict w1, r_dict w2, r_dict w3
 where r_pdic.iddict=w1.iddict and r_pdic.iddict=w2.iddict and r_pdic.iddict=w3.iddict
 and w1.word='китай' and w2.word='погрузчик' and w3.word='фронтальный'
 group by r_pdic.idpage


KRAIN32

Спасибо 1-й вроде работает.а второй не хочет - ничего не выдает...


KRAIN32

Вот тут
select r_pdic.idpage from r_pdic,r_dict where r_pdic.iddict=r_dict.iddict and
 ( r_dict.word='китай' or r_dict.word='погрузчик' or r_dict.word='фронтальный')
 group by r_pdic.idpage having count(distinct r_pdic.iddict)=<b>3</b>
Проблема появилась, если например нет какого либо элементанапример r_dict.word='китай' то запрос выполняется так же долго(15-30 секунд), а если все 3 есть, то менее секунды.Как сделать чтобы при обнаружении что одного из элементов нет в базе то сразу выход..


KRAIN32

попробуй так. Индексы есть?
select r_pdic.idpage from r_pdic,r_dict where r_pdic.iddict=r_dict.iddict and
 r_dict.word in ('китай','погрузчик','фронтальный')
 group by r_pdic.idpage having count(distinct r_pdic.iddict)=<b>3</b>


KRAIN32

Если еще не надоел...вопрос такой если по одному из слов очень большое кол-во совпаденийскажем там запрос "туристическая компания секс""секс" в базе встречается несколько миллионов разr_pdicпри этом "туристическая" и "компания" несколько тысяч.при этом получается выполнения запроса около 10сек. при норме 0,5-0,4 секунды.Вот таблицы... может что не правильно?CREATE TABLE `r_dict` ( `iddict` int(11) NOT NULL auto_increment, `word` varchar(50) NOT NULL default '', PRIMARY KEY (`iddict`), UNIQUE KEY `word` (`word`)) ENGINE=MyISAM DEFAULT CHARSET=latin1CREATE TABLE `r_pdic` ( `idpage` int(11) NOT NULL default '0', `iddict` int(11) NOT NULL default '0', KEY `iddict` (`iddict`), KEY `idpage` (`idpage`)) ENGINE=MyISAM DEFAULT CHARSET=latin1


KRAIN32

r_dict - примерно 500 000 записаейr_pdict - примерно 20 миллионов


KRAIN32

приведи explain запроса


KRAIN32

EXPLAIN select r_pdic.idpage from r_pdic,r_dict where r_pdic.iddict=r_dict.iddict and r_dict.word in ('фронтальные', 'погрузчики', 'секс') group by r_pdic.idpage having count(distinct r_pdic.iddict)=3 LIMIT 15Выдало вот это....1 SIMPLE r_dict range PRIMARY,word word 50 3 Using where; Using temporary; Using filesort1 SIMPLE r_pdic ref iddict iddict 8 sitebase.r_dict.iddict 49При вот этомselect r_pdic.idpage from r_pdic,r_dict where r_pdic.iddict=r_dict.iddict and ( r_dict.word='китай' or r_dict.word='погрузчик' or r_dict.word='фронтальный') group by r_pdic.idpage having count(distinct r_pdic.iddict)=3выдало1 SIMPLE r_dict range PRIMARY,word word 50 3 Using where; Using temporary; Using filesort1 SIMPLE r_pdic ref iddict iddict 8 sitebase.r_dict.iddict 49


KRAIN32

хмм… ну не знаю, пожалуй дальше только увеличивать кеш для индекса и подгружать индекс, поищи про это на форуме.


KRAIN32

честно говоря, странно, что файлсорт вылез…