У меня есть этот запрос, который выполняется за 1 или 2 секунды для данного случая:
Select Count(*) as qtty
From event e
Join org o On o.orgID = e.orgID
Join venue v On v.venueID = e.venueID
Where Match( e.name, e.description ) Against ( $keywords )
And e.site_id = $site_id
And e.display <> 0</code>
Он подсчитывает строки для построения разбивки на страницы. Когда я вводил фильтрацию по типу события (типы связаны со многими до многих), запрос начинался с не менее 45 секунд:
And Exists (
Select ete.id
From event_type_to_event ete
Where ete.event_id = e.eventID
And ete.event_type_id = $category )</code>
Я также попробовал присоединиться к event_type_to_event, но он был еще медленнее.
Любые предложения?
ПРИМЕЧАНИЕ. Решено. Используя индексы, время выполнения запроса сократилось до менее чем секунды.
Я подозреваю, что вам нужно добавить индекс в столбец event_type_id в таблицу event_type_to_event, но если там уже есть индекс, попробуйте следующее:
Select Count(*) as qtty
From event e
Join org o On o.orgID = e.orgID
Join venue v On v.venueID = e.venueID
Where Match( e.name, e.description ) Against ( $keywords )
And e.site_id = $site_id
And e.display <> 0
And Exists
(Select * From event_type_to_event
Where event_id = e.eventID
And event_type_id = $category)
Если Event_Id является PK таблицы event_type_to_event, вы также можете попробовать соединение вместо использования Exists,
Select Count(*) as qtty
From event e
Join org o On o.orgID = e.orgID
Join venue v On v.venueID = e.venueID
Join event_type_to_event t
On t.event_id = = e.eventID
Where Match( e.name, e.description ) Against ( $keywords )
And e.site_id = $site_id
And e.display <> 0
And t.event_type_id = $category