2010-03-23 46 views

回答

2

當你想最大的檢索速度,必須在加入或where條件兩列,但有時列具有較高的選擇性,有時列b具有較高的選擇性,你想從單一索引中利用這一事實。

另外我認爲你的機器數據大小/性能比例應該很高,同時你必須(猜測)願意將任何改進稱爲必要(即使只有少數百分比) 。

不過,經驗告訴我們事情取決於很多因素;通過特定的RDBMS和應用程序環境,您可以更好地運行自己的基準測試。編輯: 關於複合索引的進一步解釋。 from wikipedia
「索引定義中列的排列順序很重要,可以僅使用第一個索引列檢索一組行標識符,但它不可能或不高效(大多數數據庫)只使用第二個或更大的索引列檢索一組行標識符
例如,想象一個電話簿,首先按城市,然後按姓氏,然後按名字組織。城市,您可以輕鬆地提取該城市所有電話號碼的列表,但是,在這本電話簿中,查找給定姓氏的所有電話號碼將非常繁瑣,您必須查看每個城市的電話號碼帶有該姓氏的條目。「

維基百科的解釋可能過於簡化了,但它給了你基本的想法(類比要記住,電話簿通常有聚集索引,這不會是你的通用數據庫索引)。

根據索引的大小與數據結構的大小vs可用內存vs索引第一列的選擇性,使用錯誤排序的索引然後使用表掃描的成本可能要低得多。

啊,只是想到一個更好的比喻與你正在尋找的例子 想象一個很好的教科書,它會有目錄的章節和子章節和他們在哪裏的頁數(這是一個非聚集索引,其中包含指向數據記錄的指針 - 頁面)。 現在想象教科書是基於SQL-92標準的,那麼TOC中的大部分術語都是SQL術語(按照這個假設)。 本書最後還會有另外一個索引,它會列出按字母順序排列的所有有趣術語(讓我們假設主要章節名稱)和頁碼。

對於如 這樣的問題'告訴我DISTINCT出現的所有章節',您將使用第二個索引。 (因爲後來外地的選擇性高)

對於諸如 問題「告訴我,第一章下出現的詞語數量」你可以使用TOC

所以對於這樣的問題 '是否在DML章節描述了SELECT?'你可以使用任何一個索引。 (因爲這兩個字段的選擇性都很高) 但是,如果DML本身的TOC本身長度爲3頁,並且索引中的SELECT條目只有15行,那麼您可能會轉到第二行,這就是您受益的示例來自兩個指標。

現在,如果您認爲這樣做太過於複雜,請將掃描的國會圖書館數據庫考慮在內。 :)

正如我之前所說的,所有的計劃都很好,但最終還是要運行你自己的基準。

+0

+1:很好的解釋。隨意投票我的答案也 - 如果你同意:) – 2010-03-27 07:40:05

1

我不認爲有什麼真正的情況下,你需要的。

它可以使感覺,當你的表有很多列,ab不是唯一的,並且你需要以下兩個查詢的高性能:

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 

就必須深入到8i_t_b_a9找到所有行與a=1。這仍然比全表掃描要快得多(也必須全部讀取x),但速度並不像使用i_t_a_b那麼快。

+0

我做了一個測試,發現i_t_a_b也可以用於'b = 1',反之亦然 – symfony 2010-03-23 14:24:54

+0

@symfony:是它可以使用,它是更好然後對錶進行全面掃描,但對於b = 1,i_t_b_a表現更好,然後i_t_a_b – Unreason 2010-03-23 14:27:22

+0

您可以對此進行一些分析嗎?雖然直觀上聽起來很合理 – symfony 2010-03-23 14:30:02