Я хотел бы найти способ улучшить запрос, но, кажется, я все сделал. Позвольте мне дать вам некоторые детали.
Ниже приведен мой запрос:
SELECT
`u`.`id` AS `id`,
`p`.`lastname` AS `lastname`,
`p`.`firstname` AS `firstname`,
COALESCE(`r`.`value`, 0) AS `rvalue`,
SUM(`rat`.`category` = 'A') AS `count_a`,
SUM(`rat`.`category` = 'B') AS `count_b`,
SUM(`rat`.`category` = 'C') AS `count_c`
FROM
`user` `u`
JOIN `user_customer` `uc` ON (`u`.`id` = `uc`.`user_id`)
JOIN `profile` `p` ON (`p`.`id` = `u`.`profile_id`)
JOIN `ad` FORCE INDEX (fk_ad_customer_idx) ON (`uc`.`customer_id` = `ad`.`customer_id`)
JOIN `ac` ON (`ac`.`id` = `ad`.`ac_id`)
JOIN `a` ON (`a`.`id` = `ac`.`a_id`)
JOIN `rat` ON (`rat`.`code` = `a`.`rat_code`)
LEFT JOIN `r` ON (`r`.`id` = `u`.`r_id`)
GROUP BY `u`.`id`
;
Примечание: некоторые имена таблиц и столбцов добровольно скрыты.
Теперь позвольте мне дать вам некоторые объемные c данные:
user => 6534 rows
user_customer => 12 923 rows
profile => 6511 rows
ad => 320 868 rows
ac => 4505 rows
a => 536 rows
rat => 6 rows
r => 3400 rows
И, наконец, мой план выполнения:
Мой запрос в настоящее время выполняется примерно от 1,3 до 1,7 секунды, что достаточно медленно, чтобы раздражать пользователей моего приложения, конечно ... Также набор результатов для вас состоит из 165 строк.
Есть ли способ, которым я могу улучшить это?
Спасибо.
РЕДАКТИРОВАТЬ 1 ( ответ Рику Джеймсу ниже): Какова скорость и ОБЪЯСНИТЬ, когда вы не используете FORCE INDEX?
Удивительно, но становится быстрее, когда я не использую FORCE INDEX. Честно говоря, я действительно не помню, почему я сделал это изменение. Я, вероятно, нашел лучшие результаты с точки зрения производительности с ним во время одной из моих различных попыток и не удалял его с тех пор.
Когда я не использую FORCE INDEX, он использует другой индекс ad_customer_ac_id_blocked_idx (customer_id , ac_id, заблокирован) и время составляет около 1.1 se c. Я не совсем понимаю, потому что fk_ad_customer_idx (customer_id) одинаков, когда мы говорим об индексе customer_id.