我考虑在(1)中创建一个散列索引,因为它在(2)上使用了等式和位图,因为状态只能被接受'或者'不被接受'。我还能用什么?而且我的问题是我只能在mysql oracle上尝试b-tree索引..
(1)select R.user_id from rent as R
inner join supervise S on
R.adress = S.adress
and R.space_id = S.space_id
group by R.user_id
having count(distinct S.supervisor_id) = 1
(2) select distinct P.adress, P.code from space as P where (P.adress, P.code) not in (
select P.adress, P.code from space as P
natural join rent as R
natural join state as E where E.state = ‘accepted’)
答案 0 :(得分:0)
由于查询#1中没有直接限制标准,因此很可能使用合并连接完成,并且没有索引可以改善它。
对于查询#2,条件E.state = 'accepted'
的选择性如何?如果非常有选择性(<5-15%的查询结果),则在E.state
上建立索引,从E到R和从R到P的连接索引,以及P.adress, P.code
上的索引。
答案 1 :(得分:0)
每张桌子上的综合指数:
INDEX(space_id, adress)
请勿使用WHERE(a,b) IN ...
- 效果非常差。
不要使用IN ( SELECT ... )
- 它通常表现不佳。
相反,请使用JOIN
。
对于state
,请
INDEX(state)
(或者它已经是PRIMARY KEY
?)
如果您需要更多帮助,请提供SHOW CREATE TABLE
和EXPLAIN SELECT ...
。