2016-12-15 50 views
1

我正在考慮在(1)中創建散列索引,因爲它使用(2)上的等式和位圖,因爲狀態只能被「接受」或「不被接受」。我還能使用什麼?也是我的問題是,我只能儘量在MySQL的Oracle B樹索引..我應該創建哪些類型的索引來優化這些mysql查詢?

(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

爲什麼你的代碼中有['零寬度空間'(U + 200B)](http://www.fileformat.info/info/unicode/char/200b/index.htm)字符? ---爲什麼你的文字使用時髦的撇號​​(''和''',而不是''')? – Andreas

回答

0

由於沒有直接限制查詢#1指標分析,它可能會被使用合併完成加入,並沒有指數會改善這一點。

對於查詢#2,標準E.state = 'accepted'的選擇性如何?如果選擇性很強(<查詢結果的5-15%),那麼索引E.state,從E到R和從R到P的連接索引,以及索引P.adress, P.code

0

每桌綜合指數:

INDEX(space_id, adress) 

不要使用WHERE(a,b) IN ... - 它執行很差。

不要使用IN (SELECT ...) - 它往往表現不佳。

改爲使用JOIN

對於state,有

INDEX(state) 

(或者是已經PRIMARY KEY?)

如果您需要在所有這一切更多的幫助,提供SHOW CREATE TABLEEXPLAIN SELECT ...

相關問題