資料庫索引設計與優化

一、概述

1.索引誤區:

  • 索引層級不要超過5層

  • 單表的索引數不要超過6個

  • 不應該索引不穩定的列

2.在當前磁盤條件下,只有在更新頻率多於10次/秒的情況下,不穩定列才可能成為問題

二、表和索引結構

1.表和索引行都被存儲在頁中,頁的大小一般為4KB,緩衝池和I/O活動都是基於頁的

2.索引行在評估訪問路徑的時候是一個非常有用的概念,一個索引行等同於葉子頁中的一個索引條目,字段的值從表中複製到索引上,並加上一個指向表中記錄的指針

3.非葉子頁通常包含著一個(可能被截斷的)鍵值,以及一個指向下一層級頁的指針,該鍵值是下一層級頁中的最大鍵值,多個索引層級按照這一方式逐層建立,直到只剩下一個頁,這種組織方式的索引稱為B樹索引

4.內存中的緩衝池進行最小化磁盤活動,如果一個索引或者表頁在緩衝池中被找到,那麼唯一的成本就是去處理這些索引或者表的記錄,當一個索引或表頁被請求時,它的理想位置是在數據庫緩衝池中

5.輔助式隨機讀:自動跳躍式順序讀(DB2)、列表預讀(DB2)、數據塊預讀(oracle)

6.聚簇索引是指定義了新插入的錶行所在表頁的索引

三、SQL處理過程

1.訪問路徑的成本很大程度上取決於索引片的厚度,即條件表達式確定的值域範圍

四、為SELECT語句創建理想的索引

1.使用不合適的索引有可能會導致比全表掃描更差的性能

2.三星索引:

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

  • 如果索引行的順序與查詢語句的需求一致,可以標記為第二顆星,這排除了排序操作

  • 如果索引行包含查詢語句中的所有列,可以標記為第三顆星,避免了訪問表的操作,僅訪問索引就可以了

3.ORDERBY和範圍謂詞同時存在不得不犧牲第一或第二顆星

五、前瞻性的索引設計

1.基本問題法(BQ):是否有一個已存在的或者計劃中的索引包含了WHERE子句所引用的所有列(一個半寬索引)?

2.BQ的目的只是確保我們至少可以通過索引過濾來最小化對錶的訪問

3.快遞上限估算法(QUBE),在新方案的設計過程中使用

六、影響索引設計過程的因素

七、被動式索引設計

八、為表連接設置索引

1.嵌套循環連接,DBMS首先在外層表中找到一行滿足本地謂詞的記錄,然後再從內層表中查找與這一行數據相關的記錄,並檢查其中哪些符合內層表的本地謂詞條件,可以被兩個單表的遊標以及在程序中編寫的嵌套循環代替。另外還有哈希連接和合並掃描連接

2.通過冗餘數據優化連接查詢

九、星型連接

十、多索引訪問

十一、索引和索引重組

1.當在表中插入一行數據時,DBMS會嘗試將索引行添加至其索引鍵所屬的葉子頁上,但是該索引頁可能沒有足夠的空閒空間來存放這個索引行,在這種情況下,DBMS將會分裂該葉子頁

2.分裂一個索引頁只需要一次額外的同步讀,約10ms,葉子頁分裂會導致讀一個索引片變得更慢

3.索引重組是為了恢復索引行正確的物理位置,它對於索引片掃描和全索引掃描的性能而言很重要

十二、數據庫管理系統相關的索引限制

十三、數據庫索引選項

十四、優化器不是完美的

1.完全避免由索引改進導致性能下降的唯一方法是,對每一個SQL調用都使用提示

十五、其他評估事項

十六、組織索引設計過程

半寬索引:一個包含WHERE子句中所有列的索引,使用半寬索引將使得訪問路徑僅在必要時才訪問表

聚焦索引:在SQL Server中是指一個包含錶行的索引,在DB2中是指任何一個索引行順序與錶行順序相同或計劃相同的索引

聚簇索引:使得DBMS在向表中添加記錄時,將新記錄添加至由聚簇索引鍵所定義的主頁上。一張表上只能有一個聚簇索引

覆蓋索引:指一個包含了SELECT語句所涉及的所有列的索引


分享到:


相關文章: