回答
當你想最大的檢索速度,必須在加入或where條件兩列,但有時列具有較高的選擇性,有時列b具有較高的選擇性,你想從單一索引中利用這一事實。
另外我認爲你的機器數據大小/性能比例應該很高,同時你必須(猜測)願意將任何改進稱爲必要(即使只有少數百分比) 。
不過,經驗告訴我們事情取決於很多因素;通過特定的RDBMS和應用程序環境,您可以更好地運行自己的基準測試。編輯: 關於複合索引的進一步解釋。 from wikipedia:
「索引定義中列的排列順序很重要,可以僅使用第一個索引列檢索一組行標識符,但它不可能或不高效(大多數數據庫)只使用第二個或更大的索引列檢索一組行標識符
例如,想象一個電話簿,首先按城市,然後按姓氏,然後按名字組織。城市,您可以輕鬆地提取該城市所有電話號碼的列表,但是,在這本電話簿中,查找給定姓氏的所有電話號碼將非常繁瑣,您必須查看每個城市的電話號碼帶有該姓氏的條目。「
維基百科的解釋可能過於簡化了,但它給了你基本的想法(類比要記住,電話簿通常有聚集索引,這不會是你的通用數據庫索引)。
根據索引的大小與數據結構的大小vs可用內存vs索引第一列的選擇性,使用錯誤排序的索引然後使用表掃描的成本可能要低得多。
啊,只是想到一個更好的比喻與你正在尋找的例子 想象一個很好的教科書,它會有目錄的章節和子章節和他們在哪裏的頁數(這是一個非聚集索引,其中包含指向數據記錄的指針 - 頁面)。 現在想象教科書是基於SQL-92標準的,那麼TOC中的大部分術語都是SQL術語(按照這個假設)。 本書最後還會有另外一個索引,它會列出按字母順序排列的所有有趣術語(讓我們假設主要章節名稱)和頁碼。
對於如 這樣的問題'告訴我DISTINCT出現的所有章節',您將使用第二個索引。 (因爲後來外地的選擇性高)
對於諸如 問題「告訴我,第一章下出現的詞語數量」你可以使用TOC
所以對於這樣的問題 '是否在DML章節描述了SELECT?'你可以使用任何一個索引。 (因爲這兩個字段的選擇性都很高) 但是,如果DML本身的TOC本身長度爲3頁,並且索引中的SELECT條目只有15行,那麼您可能會轉到第二行,這就是您受益的示例來自兩個指標。
現在,如果您認爲這樣做太過於複雜,請將掃描的國會圖書館數據庫考慮在內。 :)
正如我之前所說的,所有的計劃都很好,但最終還是要運行你自己的基準。
我不認爲有什麼真正的情況下,你需要的。
它可以使感覺,當你的表有很多列,a
和b
不是唯一的,並且你需要以下兩個查詢的高性能:
Select Max(b) From t Where a=1 --# Would use i_t_a_b
和
Select Max(a) From t Where b=1 --# Would use i_t_b_a
假設您的表格如下所示:
a b c d e
- - - - -
0 8 x x x
0 9 x x x
1 8 x x x
1 9 x x x
i_t_a_b
看起來是這樣的:
0
8
9
1
8
9
i_t_b_a
看起來是這樣的:
8
0
1
9
0
1
Select Max(b) From t Where a=1
就必須深入到8
和i_t_b_a
9
找到所有行與a=1
。這仍然比全表掃描要快得多(也必須全部讀取x
),但速度並不像使用i_t_a_b
那麼快。
- 1. hbase中有多鍵索引和複合索引嗎?
- 2. mysql複合索引thoery
- 3. Appengine反向引用 - 需要複合索引嗎?
- 4. 在MySQL中,將兩列合併爲索引會有好處嗎?
- 5. 複合索引順序MySQL查詢
- 6. 什麼是MYSQL複合索引?
- 7. 使用tenant_id進行Mysql複合索引
- 8. 在泰坦圖中創建複合索引和混合索引
- 9. 蒙戈複合索引和排序方向
- 10. 恢復MySQL索引
- 11. MongoDB複合索引
- 12. 在MySQL中優化正向索引
- 13. mysql部分索引,反向索引
- 14. 在Fluent NHibernate中創建複合索引?
- 15. 在c中創建複合索引#
- 16. oracle複合索引列位置和非複合索引
- 17. 是否有一個用於訂購MYSQL複合索引的最佳方法?
- 18. MySQL Innodb:大型複合PK沒有其他索引
- 19. 在Mercurial中合併方向問題嗎?
- 20. 2索引合適嗎?
- 21. mysql索引合併問題
- 22. 可以在mySql表中有很多索引嗎?
- 23. MySQL的複雜的索引
- 24. 複合索引的開銷
- 25. MongoDb複合索引優化
- 26. MongoDB複合索引查詢
- 27. 複合和覆蓋索引
- 28. 使用Mongo複合索引
- 29. 複合唯一索引
- 30. 複合屬性索引
+1:很好的解釋。隨意投票我的答案也 - 如果你同意:) – 2010-03-27 07:40:05