2016-02-09 244 views
0

我有一個簡單的查詢:WHERE子句減慢SELECT查詢顯著

SELECT distinct state FROM customers WHERE country = 'us' 

的想法是讓國家的名單在美國客戶住在

我有大約800k行,以及statecountry上的索引。這個查詢需要大約4秒鐘才能運行,這太長了,因爲這需要實時。

如果我刪除WHERE子句,它幾乎可以立即計算出來。我研究了爲什麼,並且當我使用WHERE子句對查詢運行explain時,它不使用state索引。當我擺脫了WHERE子句時,它再次開始使用狀態索引。爲什麼會發生這種情況,有沒有辦法讓它使用兩個索引?

我瀏覽過類似的SO上的其他問題,但似乎對於我發現的問題,他們是非常複雜的查詢,解決方案只是查詢重寫。儘管這很簡單,但我認爲這是問題的核心。

更新:

我發現,如果我在做us_state的索引,它在約,5S,這是不夠好。儘管如此,我想在某些時候對WHERE子句有多個部分,因此爲所有部分製作複合索引仍然不是最佳選擇。因此,我將此問題留待尋找更好的解決方案。

CREATETABLE

CREATE TABLE `customers` (
`country` varchar(5) DEFAULT NULL, 
`st` varchar(50) DEFAULT NULL, 
KEY `state` (`state`), 
KEY `country` (`country`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 
+0

只是檢查,因爲有時候MySQL的查詢規劃是瘋狂的,你得到的'選擇國家客戶的WHERE國家=「美國」 GROUP BY state'類似的結果? – hobbs

+0

是的,不幸的是,'group by'也需要4秒左右。 – user3413723

+0

我建議你爲country ='us'添加一個常見的數字索引,然後做一個地方。在處理任何文本時,MySQL非常糟糕。數字,它可以很好地處理。另外,這些指數的基數是什麼? – khuderm

回答