2015-01-31 60 views
6

如果存在包含僱員詳細信息的表,其中包含列值爲M/F的列Gender。現在在這一列上創建一個索引是否有意義,它會使搜索更快?從邏輯上講,如果我們用含有性別的where子句作爲列激發select語句,它應該將搜索時間縮短一半。但是我聽說這種索引不會幫助,並且在執行查詢時實際上會被數據庫優化器忽略。但我不明白爲什麼?有人可以解釋一下嗎?具有重複值的列上的數據庫索引

+0

mysql或sybase? – Mihai 2015-01-31 20:17:05

+0

實際上這個問題一般,但是是特別是Sybase的 – Gaurav 2015-01-31 20:17:54

+0

我在網上搜索了但是沒有明確的答案,請給我棄權票的人請解釋一下,爲什麼你給我倒票。可能是如果它對你如此簡單,你可以請把答案,以及 – Gaurav 2015-01-31 20:20:25

回答

7

在大多數情況下,只有一個索引可用於優化數據庫查詢。如果查詢需要匹配多個索引列,則查詢計劃員將必須決定使用哪些索引。每個索引具有基數,這大致是整個表中不同值的數量。具有較高基數的索引將更有效,因爲選擇與索引匹配的行將導致極少數行掃描以匹配其他條件。

gender列上的索引只會將表格減半。其他任何指數都會更有效。

作爲比喻,請考慮電話簿。如果您在整個國家都有一本電話簿,那麼搜索您想要的特定人員將會非常困難。所以電話簿通常只是爲了一個城市或某個地區的一些城市而製作的,以使它們的尺寸合理。但是如果你有一個「男性電話簿」而不是地區電話簿,那它幾乎與整個國家的電話簿一樣無法使用。創建新電話簿的標準是,它們應該遠遠小於整個國家的一本書。當你以巨大的尺寸開始時,減少2倍並不是很有用。

+1

好吧,假設我的查詢需要1個小時才能執行,並且如果我能在半小時內執行它,它仍然是我的一大保存...... – Gaurav 2015-01-31 20:30:03

+0

多久你做這個查詢嗎?請記住,維護索引時存在內存和時間開銷。因此,其他許多操作將會減慢,這可能會使您節省超過半小時的時間,這些偶爾的查詢只需要性別索引。 – Barmar 2015-01-31 20:32:25

+0

它不是一個頻繁的查詢,它可能只有幾天在一天 – Gaurav 2015-01-31 20:34:00

6

大概,性別具有兩個價值。一般來說,gender上的索引不會有幫助。事實上,這可能是有害的。

如果您選擇性別而沒有索引,則查詢優化器會對數據庫頁面執行全表掃描以滿足查詢。在一個典型的頁面上,一半條目將與查詢匹配,所以您將開始在第一個匹配時獲得結果。

在查詢執行的這個階段,索引通常用於減少正在讀取的頁數。但是,如果每個頁面都有「M」和「F」的記錄,則每個頁面都必須被讀取。更糟糕的是,使用索引意味着您從一個隨機頁面讀取,然後再讀取另一個,而不是僅僅依次讀取值。跳過頁面需要多一點時間。如果這些頁面並不全都適合記憶,那麼就會出現一種叫做抖動的情況,這可能需要很長時間。

對此的一個例外是聚集索引,其中頁面上的值實際上是按值排序的。在這種情況下,使用索引的查詢速度將快大約50%,因爲只需要讀取頁面。這可以在「檔案」表格中特別有效,在該表格中您有經常搜索的活動記錄。這個標誌可能出現在記錄的10%,1%或0.1%,並且聚集索引可以顯着提高速度。

在大表上運行返回一半記錄的查詢是很少見的。很可能,與其他專欄相結合的性別將成爲納入索引的一個很好的候選人。

相關問題