Оптимизация множественного соединения или подзапроса

0

У меня есть этот запрос, который выполняется за 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, но он был еще медленнее.
Любые предложения?

ПРИМЕЧАНИЕ. Решено. Используя индексы, время выполнения запроса сократилось до менее чем секунды.

  • 1
    пожалуйста, вставьте результат запроса EXPLAIN
Теги:
optimization
profiling

1 ответ

1
Лучший ответ

Я подозреваю, что вам нужно добавить индекс в столбец 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
  • 0
    Спасибо! Я должен не без стыда признать, что впервые вижу разницу в использовании индексов! (например, новичок в БД) В любом случае, второй запрос не будет работать, так как event_type_to_event является таблицей «многие ко многим», поэтому ее также следует группировать по идентификатору события, но я также пытался это сделать, и без индексов он медленнее чем подзапрос. Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню