《資料庫索引設計優化》讀書筆記(二)

2021-07-09 19:05:12 字數 1782 閱讀 9819

第4章 為select語句建立理想的索引

練習

4.1 為sql4.5中的查詢語句設計候選索引a和選索引b。

-- sql 4.5

select a, b, d, e

from orderitem

where b between :b1 and :b2 -- (ff = 1...10%)

and c = 1 -- (ff = 2%)

and e > 0 -- (ff = 50%)

and f = :f -- (ff = 0.1...1%)

order by a, b, c, f

-- we want 20 rows please

分析:

在sql4.5中的查詢語句的where子句中有四個謂詞條件,分別是,乙個範圍繫結變數謂詞b between :b1 and :b2,乙個等值常量謂詞c = 1,乙個範圍常量謂詞e > 0,乙個等值繫結變數謂詞f = :f。四個謂詞條件的過濾因子分別是ff = 1...10%、ff = 2%、ff = 50%、ff = 0.1...1%。每次結果集有20條,按照a、b、c、f排序。

過濾因子(filter factor)描述了謂詞的選擇性,即表中滿足謂詞條件的記錄行數所佔全部行數的比例,它主要依賴於列值的分布情況。

範圍謂詞欄位e沒有出現在排序中,而排序中出現的字段a沒有出現在where子句的謂詞中。根據三星索引理論,不可能為sql 4.5建立理想的三星索引(第一顆星和第二顆星不可兼得),所以候選索引a為第一星+第三星的索引,候選索引b為第二星+第三星的索引。

建立候選a

1. 取出對於優化器來說不過分複雜的(bt謂詞)等值謂詞列,將這些列作為索引的前導列,為了使前導的索引片更小,按照將選擇性最好的列順序。最好的選擇性是指對於最差的輸入值有最低的過濾因子。sql4.5中有兩個等值謂詞列c和f,過濾因子分別是2%和1%,所以候選索引為(f,c)。

2. 將選擇性最好的範圍謂詞作為索引的下乙個列,如果存在的話。只考慮對於優化器來說不過分複雜的(bt謂詞)範圍謂詞即可。sql4.5中有兩個範圍謂詞列b和e,過濾因子分別是10%和50%,所以候選索引為(f,c,b,e)。

3. 以正確的順序新增order by列(如果order by列有desc的話,加上desc)。忽略在第1步和第2步中已經新增的列。此時候選索引為(f,c,b,e,a)。

4. 以易變性從低到高的順序將select語句中其餘的列新增至索引中。此時候選索引為(f,c,b,e,a,d),這也就是最終的候選索引a。

建立候選b

1. 取出對於優化器來說不過分複雜的(bt謂詞)等值謂詞列,將這些列作為索引的前導列,為了使前導的索引片更小,按照將選擇性最好的列順序。最好的選擇性是指對於最差的輸入值有最低的過濾因子。sql4.5中有兩個等值謂詞列c和f,過濾因子分別是2%和1%,所以候選索引為(f,c)。

2. 以正確的順序新增order by列(如果order by列有desc的話,加上desc)。忽略在第1步中已經新增的列。此時候選索引為(f,c,a,b)。

3. 以易變性從低到高的順序將select語句中其餘的列新增至索引中。此時候選索引為(f,c,a,b,d,e),這也就是最終的候選索引a。

4.2 對每乙個候選索引,計算在最差情況下乙個事務必須訪問的索引行數。orderitem表有100000000行。

候選a1%*2%*10%*50% * 100000000 = 1000行

候選b1%*2% * 100000000 = 20000行

《資料庫索引設計優化》讀書筆記(一)

第3章 sql處理過程 練習 3.1 為sql3.7中所示的查詢設計盡可能好的索引 sql 3.7 select lname,fname,cno from cust where m and height 190 order by lname,fname 分析 本書第4章提出了乙個三星索引的概念。如果...

《資料庫索引設計優化》讀書筆記(四)

第7章 被動式索引設計 練習 7.1 你將如何歸類圖7.12中的尖刺 有優化空間的問題製造者,無優化空間的問題製造者,還是受害者?分析 如圖7.2所示,我們首先要區分的是問題的製造者及受害者。長服務時間為問題製造者,長排隊時間為受害者。如果乙個事務獨佔了資源 也許是因為使用了不合適的索引 那麼就會對...

《資料庫索引設計優化》讀書筆記(七)

第13章 資料庫索引選項 練習 13.1 調查你當前使用的dbms版本關於索引的限制和高階選項。索引行壓縮與異常情況 mysql支援 oracle支援 mysql使用null值實現索引行壓縮。但不推薦在實際中使用null來代替乙個特定的值,因為從長遠來看,這可能會導致應用系統錯誤。表中有三個null...