我有一个深层次的模型,看起来像这样:
帐户 - >场地 - >活动 - >访客列表 - >车票
我需要进行查询,根据父访客列表或事件或场地或帐户选择门票,所以它看起来像这样:
查询:
select * from user_detail ud, venue v, event e, guest_list g, ticket t
where
t.guest_list = g.id
and g.event = e.id
and e.venue = v.id
and (
ud.guest_list = t.guest_list
or ud.event = g.event
or ud.venue = e.venue
or ud.account = v.account
)
这当然是一个非常昂贵的查询,因为我有数百万的门票 - 这不像我希望的那样有效。
非理想解决方案(在故障单级别存储冗余父参考)
我正在考虑的解决方案是通过不仅存储直接父级而且将所有超级父级存储在故障单行中来优化这一点,因此我不会仅参考访客列表表,而是引用父事件,场所和记入每张票。 虽然这很容易实现,但这意味着我会存储冗余数据并且更改父级可能会很麻烦且容易出错。
理想的解决方案(不需要冗余数据)
这里有什么建议吗?
答案 0 :(得分:3)
提高OR
效果的最常用方法之一就是使用UNION ALL
。
将您的查询拆分为4(每个只有一个联接)和UNION ALL
他们
另外,我希望t.guest_list
,g.event
,e.venue
和v.account
被索引覆盖,不是吗?