我有一個簡單的查詢:WHERE子句減慢SELECT查詢顯著
SELECT distinct state FROM customers WHERE country = 'us'
的想法是讓國家的名單在美國客戶住在
我有大約800k行,以及state
和country
上的索引。這個查詢需要大約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
只是檢查,因爲有時候MySQL的查詢規劃是瘋狂的,你得到的'選擇國家客戶的WHERE國家=「美國」 GROUP BY state'類似的結果? – hobbs
是的,不幸的是,'group by'也需要4秒左右。 – user3413723
我建議你爲country ='us'添加一個常見的數字索引,然後做一個地方。在處理任何文本時,MySQL非常糟糕。數字,它可以很好地處理。另外,這些指數的基數是什麼? – khuderm