2016-04-08 232 views
0

該想法是基於列c1c2c3進行快速查詢。MySQL - 多列唯一索引

有3種查詢:

SELECT COUNT(*) FROM tbl WHERE c1=... AND c2=... 
SELECT c2, c3 FROM tbl WHERE c1=... 
SELECT DISTINCT c2 FROM tbl WHERE c1=... AND c3=... 

什麼是建立索引,如果我想讓最好的辦法(c1c2)是唯一的?

我想一個單一的指標是這樣的:

UNIQUE INDEX idx_c1_c2 (c1, c2) 

但第三查詢不會使用這個指數。

有什麼建議嗎?

+0

請同時顯示where子句完成的3個查詢。因爲where子句主要引導indexi評估 – scaisEdge

+0

第三個查詢_will_使用索引掃描「c1」列。然後它將掃描表格以滿足'c3'條件。 –

+0

@scaisEdge'...'只是文字。 – WoLfPwNeR

回答

0

WHERE c1= AND c2=需要INDEX(c1, c2)以任意順序。如果那一對是「獨一無二的」,那麼使它成爲UNIQUE而不是INDEX。或者考慮使它成爲PRIMARY KEY(這也是UNIQUEINDEX)。

WHERE c1=將很高興地使用任何種類的索引起始c1

WHERE c1= AND c3=只會使用(c1, c2)c1部分,這會有所幫助。更好的辦法是以任意順序添加另一個索引:INDEX(c1, c3)。建議(c3, c1)以獲得一些變化。

沒有一個索引對於所有三個查詢都「很好」。

如果表爲Engine=InnoDB,則通過PRIMARY KEY搜索通常比通過UNIQUE INDEX更快。如果您現在有AUTO_INCREMENT作爲PRIMARY KEY,請考慮是否值得保留,而不是替換爲「自然」(c1, c2)