我应该创建哪些和哪些类型的索引来优化这些mysql查询?

时间:2016-12-15 19:04:54

标签: mysql indexing hash b-tree

我考虑在(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’)

2 个答案:

答案 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 TABLEEXPLAIN SELECT ...