我想找到一种改进查询的方法,但看来我已经完成了所有工作。让我给你一些细节。
以下是我的查询:
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`
;
注意:某些表名和列名被自动隐藏。
现在让我给您一些体积数据:
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秒内运行,这足够慢,足以使我的应用程序的用户烦恼...而且fyi结果集由165行组成。
我有办法改善这一点吗?
谢谢。
编辑1(下面是对Rick James的回答):不使用FORCE INDEX时的速度和说明是什么?
令人惊讶的是,当我不使用FORCE INDEX时,它会变得更快。老实说,我真的不记得为什么要进行这种更改。在进行各种尝试之一后,我可能发现它在性能方面有更好的结果,此后一直没有删除它。
[当我不使用强制索引时,它使用另一个索引ad_customer_ac_id_blocked_idx(customer_id,ac_id,已阻止),时间约为1.1秒。我不太了解,因为当我们谈论customer_id的索引时,fk_ad_customer_idx(customer_id)是相同的。
我想找到一种改进查询的方法,但看来我已经完成了所有工作。让我给你一些细节。下面是我的查询:选择`u`.id` AS`id`,`p`.`lastname` AS`lastname`,`p` ....
首先,您不需要查询中的tick
。everyTableAndColumn
,也不需要结果列,别名等。tick
标记主要用于与保留作品冲突的情况,因此解析器知道您所指的是特定的列...就像具有一个名为“ JOIN”的COLUMN的表一样,但是JOIN是SQL命令的一部分...请参阅将引起的混乱。也有助于提高可读性。
摆脱FORCE INDEX
。即使昨天有所帮助;明天可能会受伤。