优化器应该可以做到这一点,但您可能希望将原始查询的性能与此进行比较:
select distinct
c.company_name,
o.outlet_name,
o.outlet_fce_id,
ug.usergroup_name
from company c
inner join (select distinct company_id, outlet_id, username from purchase_invoice) i on c.company_id=i.company_id
inner join outlet o
on i.outlet_id = o.outlet_id
and i.company_id = o.company_id
inner join ot_user u on b.username = e.username
inner join user_group ug on u.usergroup_id = d.usergroup_id
purschases 表上的不同可以消除一些工作,但我怀疑是否会有那么多骗子。
更有帮助的是purchase_invoice (username, outlet_id, company_id)
. 这可以加快速度,因为它将是表上的覆盖索引。连接只需要查看索引并且可以跳过读取实际表。如果桌子很宽,这会有所帮助。
还要注意索引中列的顺序。我猜它ct_user
也有很多行,并且它在Username
. 这样索引和ct_user
将按用户名排序,允许合并连接以连接两个大表。
还请为您的表使用连接语法和有意义的别名,例如 c fr company 和 ug 用于 user_group。这对数据库无关紧要,但它无疑可以帮助人们尝试阅读您的代码。此外,所有大写字母看起来就像你一直在尖叫,但也许这只是我 :-)
GJ