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

2021-07-09 19:03:59 字數 2174 閱讀 9436

第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章提出了乙個三星索引的概念。

如果與乙個查詢相關的索引行是相鄰的,或者至少相距足夠靠近的話,那這個索引就可以被標記上第一顆星。這最小化了必須掃瞄的索引片的寬度。

如果乙個索引行的順序與查詢語句的需求一致,則該索引可以被標記上第二顆星。這消除了排序操作。

如果乙個索引行包含查詢語句中的所有列,那麼該索引就可以被標記上第三顆星。這避免了訪問表的操作。

在這個定義中又提及了索引行和索引片,概念如下。

索引行:

索引行與表中的行類似,就是索引中的乙個特定索引值對應的索引條目。索引中的索引行都是唯一的,唯一索引和非唯一索引的區別是葉子頁中乙個索引行包含的指向表中記錄的指標數。對於唯一索引,欄位的值從表中複製到索引上,並加上乙個指向表中記錄的指標。對於非唯一索引,乙個葉子頁中索引行的實際儲存方式是乙個特定的索引值後帶多個指向表中記錄的指標。

索引片:

索引匹配列的值域範圍。

查詢語句的理想索引是乙個三星索引。3.1的題目就可以轉化成為sql 3.7的查詢語句建立理想索引的問題。

為了滿足第一顆星

把等值謂詞的列作為索引最開頭的列————如果有多個等值謂詞,索引中的字段以任意順序都可以。對於sql3.7來說,三星索引以***開頭。又因為乙個範圍謂詞是索引匹配過程中的最後乙個匹配字段,所以定義索引(***,height)可以讓dbms讀取多個窄片索引。在這種情況下,必須掃瞄的索引片寬度被縮減至最窄。

為了滿足第二顆星

將order by列加入到索引中。不要改變這些列的順序,但是忽略那些在第一步中已經加入索引的列。在sql3.7中,因為既有範圍謂詞又有排序,並且是不同的列,所以第一顆星和第二顆星只能滿足乙個。也就是說無法為sql3.7建立乙個理想索引,只能為其建立乙個最佳索引。候選索引為(***,height)和(***,lname,fname)

為了滿足第三顆星

將查詢語句中剩餘的列加到索引中去,列在索引中新增的順序對查詢語句的效能沒有影響,但是將易變的列放在最後能降低更新的成本。候選索引為(***,height,lname,fname,cno)和(***,lname,fname,height,cno)

至此,為sql3.7設計的候選索引為(***,height,lname,fname,cno)和(***,lname,fname,height,cno),第乙個可以縮減需要掃瞄的索引片但需要排序,第二個可以消除排序但索引片不是最小。這兩個方案最終選擇哪個,還需要過濾因子和結果集大小的相關資訊。這個例子中,身高高於190的過濾因子應該很小,從而得到的結果集也很小,而通常來說,對乙個小的結果集排序要比掃瞄乙個大的索引片要好,所以最佳索引為(***,height,lname,fname,cno)。

3.2 為sql3.8中所示的查詢設計盡可能好的索引:

-- sql 3.8

select lname, fname, cno

from cust

where *** = 'm'

and (weight > 90 or height > 190)

order by lname, fname ;

分析:

在sql 3.8的查詢中,由於or操作符的存在,無論是(***,weight,height)索引還是(***,height,weight)索引,dbms都不能唯讀乙個索引片,可行的替代方案有全索引掃瞄、全表掃瞄,以及多索引訪問。

假設乙個謂詞的判定結果為false,而這時如果不檢查其他謂詞就不能確定地將一行記錄排除在外,那麼這類謂詞被稱為非布林(non-boolean term)謂詞或非bt謂詞。sql 3.8裡的weight > 90和height > 190就是非bt謂詞,而*** = 'm'是bt謂詞。非bt謂詞對於優化器而言就是太困難的。

同樣依據對sql3.7的分析,最佳索引為(***,lname,fname,weight,height,cno),雖然這個索引需要掃瞄的索引片很大(50%左右),但通過全索引掃瞄和過濾可以消除排序和回表。

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

第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 ...

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

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

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

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