Как я могу улучшить производительность этого запроса MySQL? - PullRequest
2 голосов
/ 15 октября 2010

У меня есть запрос MySQL:

   SELECT DISTINCT 
          c.id, 
          c.company_name, 
          cd.firstname, 
          cd.surname, 
          cis.description AS industry_sector 
     FROM (clients c) 
     JOIN clients_details cd ON c.id = cd.client_id 
LEFT JOIN clients_industry_sectors cis ON cd.industry_sector_id = cis.id 
    WHERE c.record_type='virgin'
 ORDER BY date_action, company_name asc, id desc 
    LIMIT 30

Таблица клиентов имеет около 60-70 тыс. Строк и имеет индекс для «id», «record_type», «date_action» и «company_name» - к сожалению,запрос по-прежнему занимает 5+ секунд.Удаление «ORDER BY» уменьшает это до 30 мс, поскольку сортировка файлов не требуется.Можно ли как-нибудь изменить этот запрос, чтобы улучшить время ответа 5+ секунд?

Ответы [ 4 ]

2 голосов
/ 15 октября 2010

См .: http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html

Особенно:

В некоторых случаях MySQL не может использовать индексы для разрешения ORDER BY (..). Эти случаи включают в себя следующее:
(..)
Вы объединяете много таблиц, и столбцы в ORDER BY не все из первой непостоянной таблицы, которая используется для получения строк. (Это первая таблица в выводе EXPLAIN, которая не имеет типа соединения const.)

0 голосов
/ 19 октября 2010

Большое спасибо за вклад и предложения. В конце концов я решил создать новую таблицу БД, единственной целью которой является существование, чтобы возвращать результаты для этой цели, поэтому не требуется никаких объединений, я просто обновляю таблицу, когда записи добавляются или удаляются в / из главной таблицы клиентов , Не идеально с точки зрения хранения данных, но это решает проблему и означает, что я получаю результаты фантастически быстро. :)

0 голосов
/ 15 октября 2010

Не видя всех ваших таблиц и индексов, трудно сказать.Задавая вопрос об ускорении запроса, запрос является лишь частью уравнения.

  • Имеет ли clients индекс для id?
  • Имеет ли clientsимеет индекс на record_type
  • Имеет ли clients_details индекс на client_id?
  • Имеет ли clients_industry_sectors индекс на id?

Это минимум, необходимый для быстрого выполнения запроса.

0 голосов
/ 15 октября 2010

У вас есть индекс для id, record_type, date_action.Но если вы хотите упорядочить по date_action, вам действительно нужен индекс, который имеет date_action в качестве первого поля в индексе, предпочтительно совпадая с точными полями в порядке по.В противном случае да, это будет медленный запрос.

...