Mysql

我需要索引一個我分區的鍵嗎?

  • March 15, 2018

我有一個 InnoDB 客戶表,按 KEY 分區,每個分區都是美國的一個州。我有電話號碼索引,性能很棒。我們還需要在給定的美國州按姓氏進行選擇。我應該在姓氏和狀態上創建索引,還是因為表已經按狀態分區,所以這樣做沒有意義?

這是否會佔用不必要的空間,因為 InnoDB 應該已經知道哪個分區是哪個狀態,並且它只需要找到該分區中與姓氏匹配的所有行?

我們沒有做任何連接……這只是一個簡單的查詢,如下所示:

SELECT * FROM table WHERE lastname = "Smith" AND state="NY"

您應該創建一個索引,其中lastname可能包含state,lastname.

想想看。什麼會要求查詢優化器計劃查詢以在分區內按姓氏搜尋?唯一的做法是在正確的分區內進行全表掃描。

假設美國有 50 個州(沒有波多黎各、關島、美國聯邦或保護國)

如果您有 100 萬行,那麼每個州平均有 20,000 行。對姓氏進行 20,000 次表掃描可能並沒有那麼糟糕。然而,我們談論的是美國。巨大的數字可能生活在紐約、加利福尼亞、德克薩斯和佛羅里達。少數人將居住在羅德島、愛達荷州、懷俄明州和蒙大拿州。通過全表掃描的搜尋時間會有很大差異。鑑於此,對每個州內的名稱進行索引將是有益的。

我建議兩個索引

  • LastName :第二個索引將使查詢優化器在每個分區中搜尋 LastName。每天進行 50 次索引查找肯定會擊敗 50 次全表掃描。您提到您只有電話號碼的索引,並且性能非常好。同樣的情況也必須適用於 LastName-only 索引。
  • State,LastName :第一個索引將使查詢優化器僅在一個分區下搜尋 LastName,即您選擇的狀態(如果查詢優化器足夠智能以檢查查詢並選擇正確的分區,則可能沒有必要)。

更新 2012-10-09 16:21 EDT

公平地說,對於MySQL 的分區,如果查詢優化器足夠聰明,可以根據 WHERE 子句從一個分區中導航數據檢索,那麼索引(state,lastname)可能是不必要的。儘管如此,您仍然必須在lastname. 這樣,每個分區都在 lastname 上建立索引。

我最初的索引建議(state,lastname)實際上是基於我過去如何索引在 MERGE 儲存引擎下組合的 MyISAM 表

這是我過去在 MERGE 表上的範例:

由於實現了表分區,因此對姓氏進行索引就足夠了。事實上,回想一下你說過電話號碼被索引並且性能很好,所以,我第二次說,索引姓氏也應該對你有好處。

引用自:https://dba.stackexchange.com/questions/25554