Как использовать индекс в запросе с большим количеством объединений, чтобы сделать его быстрее? - PullRequest
0 голосов
/ 17 марта 2020

Так что я пытаюсь сделать мой запрос быстрее, потому что в нем много строк, чтобы извлечь около 400 тыс. Строк. Я хочу использовать индекс, если этот столбец является нулевым. Ниже приведен мой пример запроса:

SELECT
DISTINCT table_1.id,
CONCAT(table_1.firstname, ' ', table_1.lastname) AS fullname,
table_1.firstname,
table_1.lastname,
table_1.email_address,
table_1.telephone,
table_4.description AS organization,
table_5.description AS location,
table_6.description AS department,
CASE
WHEN table_3.description IS NOT NULL THEN table_3.description
ELSE 'General User'
END AS user_role,
table_3.sup_admin,
table_1.employee_id

FROM table_1 

JOIN table_2 ON table_2.sd_users_id = table_1.id
JOIN table_3 ON table_2.sd_menu_user_role_id = table_3.id

LEFT JOIN table_4 ON table_4.id = table_1.sd_organization_id
LEFT JOIN table_5 ON table_5.id = table_1.sm_fusion_location_id
LEFT JOIN table_6  ON table_6.id = table_1.sd_department_id

WHERE table_1.status = 'A'

AND table_2.sd_menu_user_role_id IS NULL

GROUP BY table_1.employee_id
ORDER BY email_address ASC

AND table_2.sd_menu_user_role_id IS NULL - это фильтр, который я использую для показа только общих пользователей, как вы можете видеть из приведенного выше случая.

Требуется около 2 минут, чтобы показать результат. Кто-нибудь, помогите мне, пожалуйста.

Ответы [ 2 ]

0 голосов
/ 22 марта 2020

Это не имеет смысла:

JOIN table_3
   ON table_2.sd_menu_user_role_id = table_3.id
...
WHERE table_2.sd_menu_user_role_id IS NULL

Кажется, это говорит о том, что он не может использовать table_3. Удалить table_3 из этого и других мест; посмотрите, работает ли он так же, но быстрее.

Также есть этот составной индекс:

table_1:  (status, employee_id)  -- in this order
0 голосов
/ 17 марта 2020

Создание индексов в следующих местах

  • столбцы предложения WHERE

  • столбцы, используемые при ON JOINS

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...