我被告知並隨處閱讀(但沒有人敢於解釋爲什麼),當在多列上組合索引時,出於性能原因,我應該首先放置最具選擇性的列。 這是爲什麼? 這是一個神話嗎?多列索引列順序
多列索引列順序
回答
我應該把最有選擇性的列第一
According to Tom,列選擇性對使用的所有列的索引的查詢性能沒有影響(它會影響甲骨文的壓縮指數的能力)。
它不是第一件事,它不是最重要的東西。當然,這是值得考慮的事情,但它在事物的宏偉計劃中相對較遠。
在某些奇怪的,非常特殊和異常情況下(如上面真的完全偏斜數據),選擇性易事然而,他們 真正依賴的價值觀使用
一)非常罕見 B)在運行時,因爲所有傾斜的查詢都是
所以一般來說,看看你有的問題,儘量減少你需要的索引。
考慮 索引中的位置時,連接索引中列中不同值的數量不相關。
但是,在決定索引列順序時,應考慮這些因素。更重要的是確保索引對許多查詢有用,所以列順序必須反映這些列的使用(或者缺少)以用於查詢的where子句(出於AndreKR所闡述的原因)。
如何使用索引 - 這是決定時相關的內容。
所有其他的事情是平等的,我仍然會把最有選擇性的列首先。它感覺不錯...
更新:Another quote from Tom(感謝米蘭找到它)。
在Oracle 5(是的,第5版!),還有爲:首先將最有選擇性的列 索引中的一個參數。
從那時起,在指數 中首先放置最具區分性的條目將會使指數變得更小或更有效。它似乎會,但它不會。
隨着索引 密鑰壓縮,有一個引人注目的論據去相反的方式,因爲它可以使指數 更小。但是,如前所述,這應該由您如何使用指數來驅動。
使用索引時,可以省略從右到左的列,即當您有索引col_a, col_b
時,可以在WHERE col_a = x
中使用它,但在WHERE col_b = x
中不能使用它。
想象一下,有一本電話號碼簿按姓氏排序,首字母爲,然後是。
至少在歐洲和美國,名字的選擇性比姓氏低得多,因此查找名字不會縮小結果集,所以仍然會有很多頁面來檢查正確的姓氏。
索引中列的排序應該由您的查詢決定,而不是任何選擇性考慮因素。如果(a,b,c)有一個索引,並且大多數單列查詢都是針對c列的,然後是a,然後將它們按c,a,b的順序放在索引定義中以獲得最佳效率。 Oracle傾向於在查詢中使用索引的前沿,但可以在稱爲跳過掃描的效率較低的訪問路徑中使用索引中的其他列。
更具選擇性的是您的指數,最快的是研究。
簡單想象一個電話簿:你可以通過姓氏快速找到某人。但是,如果你有很多姓氏相同的人,那麼你每次都要查看姓氏,這樣你就會有更多的時間來尋找這個人。
因此,您必須先選擇最具選擇性的列,以儘可能避免此問題。
此外,您應該確保您的查詢正確使用這些「選擇性標準」。
- 1. MySQL的 - 多列索引的順序
- 2. SQL Server索引 - 列順序
- 3. 索引列和順序
- 4. 如何在Hibernate的多列索引中指定列的順序?
- 5. SQL索引標識列排序順序
- 6. 多列索引或者時間序列MySQL表多個索引?
- 7. 通過索引列的順序
- 8. 列索引順序SQLite的創建表
- 9. Sql Server 2005索引列順序
- 10. 引導列順序
- 11. 索引多列
- 12. 索引多列
- 13. mysql多列順序
- 14. mysql多列順序
- 15. 多列順序MySQL
- 16. 帶有ORDER BY查詢的多列索引順序
- 17. 多列索引和SQL查詢的順序
- 18. 排序後檢索索引值Enum按字母順序排列
- 19. 多列索引VS多個索引
- 20. MySQL中where子句中的多列索引列的順序是否重要?
- 21. 如果我按不同順序使用列,MySQL會使用多列索引嗎?
- 22. 如何使用fluent-nhibernate更改多列索引中的列順序?
- 23. 添加列排序索引到列標題多列排序
- 24. mysql多列排序順序
- 25. MySQL多列索引
- 26. 多列mysql索引
- 27. Grails多列索引
- 28. MYSQL多列索引
- 29. 多索引熊貓DataFrame順序排序
- 30. 多列索引搜索Microsoft.Isam.Esent
哇,很多問題的答案我不會讓 – milan 2010-11-24 07:25:33