如果存在包含僱員詳細信息的表,其中包含列值爲M/F的列Gender。現在在這一列上創建一個索引是否有意義,它會使搜索更快?從邏輯上講,如果我們用含有性別的where子句作爲列激發select語句,它應該將搜索時間縮短一半。但是我聽說這種索引不會幫助,並且在執行查詢時實際上會被數據庫優化器忽略。但我不明白爲什麼?有人可以解釋一下嗎?具有重複值的列上的數據庫索引
回答
在大多數情況下,只有一個索引可用於優化數據庫查詢。如果查詢需要匹配多個索引列,則查詢計劃員將必須決定使用哪些索引。每個索引具有基數,這大致是整個表中不同值的數量。具有較高基數的索引將更有效,因爲選擇與索引匹配的行將導致極少數行掃描以匹配其他條件。
gender
列上的索引只會將表格減半。其他任何指數都會更有效。
作爲比喻,請考慮電話簿。如果您在整個國家都有一本電話簿,那麼搜索您想要的特定人員將會非常困難。所以電話簿通常只是爲了一個城市或某個地區的一些城市而製作的,以使它們的尺寸合理。但是如果你有一個「男性電話簿」而不是地區電話簿,那它幾乎與整個國家的電話簿一樣無法使用。創建新電話簿的標準是,它們應該遠遠小於整個國家的一本書。當你以巨大的尺寸開始時,減少2倍並不是很有用。
大概,性別具有兩個價值。一般來說,gender
上的索引不會有幫助。事實上,這可能是有害的。
如果您選擇性別而沒有索引,則查詢優化器會對數據庫頁面執行全表掃描以滿足查詢。在一個典型的頁面上,一半條目將與查詢匹配,所以您將開始在第一個匹配時獲得結果。
在查詢執行的這個階段,索引通常用於減少正在讀取的頁數。但是,如果每個頁面都有「M」和「F」的記錄,則每個頁面都必須被讀取。更糟糕的是,使用索引意味着您從一個隨機頁面讀取,然後再讀取另一個,而不是僅僅依次讀取值。跳過頁面需要多一點時間。如果這些頁面並不全都適合記憶,那麼就會出現一種叫做抖動的情況,這可能需要很長時間。
對此的一個例外是聚集索引,其中頁面上的值實際上是按值排序的。在這種情況下,使用索引的查詢速度將快大約50%,因爲只需要讀取頁面。這可以在「檔案」表格中特別有效,在該表格中您有經常搜索的活動記錄。這個標誌可能出現在記錄的10%,1%或0.1%,並且聚集索引可以顯着提高速度。
在大表上運行返回一半記錄的查詢是很少見的。很可能,與其他專欄相結合的性別將成爲納入索引的一個很好的候選人。
- 1. 具有重複值的列上的聚簇索引
- 2. 具有靈活索引的數據庫?
- 3. 如何在數據庫中存儲具有重複值的值
- 4. 帶有重複值的Excel列,返回索引值另一列
- 5. 是否有一個索引不具有許多不同值的數據庫列?
- 6. 查找具有特定值的數據集中列的索引
- 7. 索引列有重複值的列有什麼好處嗎?
- 8. 具有兩個值的重置索引
- 9. 查找具有接近重複值的行的索引
- 10. MySQL主鍵列上的重複索引?
- 11. 在數據幀中選擇具有索引的列和行值
- 12. 複合數據庫索引
- 13. Oracle數據庫:具有NULL值的索引組織表(在多列主鍵中)
- 14. 重複的行具有唯一索引MySQL和NULL列
- 15. 使用Pandas導入數據表 - 異常:索引(列0)有重複的值[nan]
- 16. JS查找數組中重複值的索引,如果有兩個以上重複的數據
- 17. 在具有多個重複數據組的列上分組
- 18. Rethinkdb複合索引上具有多值eqJoin的性能
- 19. MySQL數據庫中是否有重複索引
- 20. 索引值序列在關係數據庫中是否重要?
- 21. 遞增具有重複索引的Numpy數組
- 22. 具有重複索引的映射數組?
- 23. noSQL數據庫中的雙重索引
- 24. 按順序重新排列具有重複值的數組
- 25. 重新索引數據框的問題:重建索引只對唯一有價值的索引對象有效
- 26. 索爾(重新)索引數據庫
- 27. 添加索引(重複的OK)訪問數據庫C#
- 28. 優先從mysql數據庫中刪除重複的索引
- 29. Cassandra - 在具有許多唯一值的多列上索引
- 30. 從多索引中選擇(具有重複值)
mysql或sybase? – Mihai 2015-01-31 20:17:05
實際上這個問題一般,但是是特別是Sybase的 – Gaurav 2015-01-31 20:17:54
我在網上搜索了但是沒有明確的答案,請給我棄權票的人請解釋一下,爲什麼你給我倒票。可能是如果它對你如此簡單,你可以請把答案,以及 – Gaurav 2015-01-31 20:20:25