一、概述
1.索引誤區(qū):
索引層級(jí)不要超過5層
單表的索引數(shù)不要超過6個(gè)
不應(yīng)該索引不穩(wěn)定的列
2.在當(dāng)前磁盤條件下,只有在更新頻率多于10次/秒的情況下,不穩(wěn)定列才可能成為問題
二、表和索引結(jié)構(gòu)
1.表和索引行都被存儲(chǔ)在頁中,頁的大小一般為4KB,緩沖池和I/O活動(dòng)都是基于頁的
2.索引行在評(píng)估訪問路徑的時(shí)候是一個(gè)非常有用的概念,一個(gè)索引行等同于葉子頁中的一個(gè)索引條目,字段的值從表中復(fù)制到索引上,并加上一個(gè)指向表中記錄的指針
3.非葉子頁通常包含著一個(gè)(可能被截?cái)嗟模╂I值,以及一個(gè)指向下一層級(jí)頁的指針,該鍵值是下一層級(jí)頁中的最大鍵值,多個(gè)索引層級(jí)按照這一方式逐層建立,直到只剩下一個(gè)頁,這種組織方式的索引稱為B樹索引
4.內(nèi)存中的緩沖池進(jìn)行最小化磁盤活動(dòng),如果一個(gè)索引或者表頁在緩沖池中被找到,那么唯一的成本就是去處理這些索引或者表的記錄,當(dāng)一個(gè)索引或表頁被請(qǐng)求時(shí),它的理想位置是在數(shù)據(jù)庫緩沖池中
5.輔助式隨機(jī)讀:自動(dòng)跳躍式順序讀(DB2)、列表預(yù)讀(DB2)、數(shù)據(jù)塊預(yù)讀(oracle)
6.聚簇索引是指定義了新插入的表行所在表頁的索引
三、SQL處理過程
1.訪問路徑的成本很大程度上取決于索引片的厚度,即條件表達(dá)式確定的值域范圍
四、為SELECT語句創(chuàng)建理想的索引
1.使用不合適的索引有可能會(huì)導(dǎo)致比全表掃描更差的性能
2.三星索引:
如果與一個(gè)查詢相關(guān)的索引行是相鄰的,或者至少相距足夠靠近的話,就可以標(biāo)上第一顆星,這是最小化了必須掃描的索引片的寬度
如果索引行的順序與查詢語句的需求一致,可以標(biāo)記為第二顆星,這排除了排序操作
如果索引行包含查詢語句中的所有列,可以標(biāo)記為第三顆星,避免了訪問表的操作,僅訪問索引就可以了
3.ORDERBY和范圍謂詞同時(shí)存在不得不犧牲第一或第二顆星
五、前瞻性的索引設(shè)計(jì)
1.基本問題法(BQ):是否有一個(gè)已存在的或者計(jì)劃中的索引包含了WHERE子句所引用的所有列(一個(gè)半寬索引)?
2.BQ的目的只是確保我們至少可以通過索引過濾來最小化對(duì)表的訪問
3.快遞上限估算法(QUBE),在新方案的設(shè)計(jì)過程中使用
六、影響索引設(shè)計(jì)過程的因素
七、被動(dòng)式索引設(shè)計(jì)
八、為表連接設(shè)置索引
1.嵌套循環(huán)連接,DBMS首先在外層表中找到一行滿足本地謂詞的記錄,然后再從內(nèi)層表中查找與這一行數(shù)據(jù)相關(guān)的記錄,并檢查其中哪些符合內(nèi)層表的本地謂詞條件,可以被兩個(gè)單表的游標(biāo)以及在程序中編寫的嵌套循環(huán)代替。另外還有哈希連接和合并掃描連接
2.通過冗余數(shù)據(jù)優(yōu)化連接查詢
九、星型連接
十、多索引訪問
十一、索引和索引重組
1.當(dāng)在表中插入一行數(shù)據(jù)時(shí),DBMS會(huì)嘗試將索引行添加至其索引鍵所屬的葉子頁上,但是該索引頁可能沒有足夠的空閑空間來存放這個(gè)索引行,在這種情況下,DBMS將會(huì)分裂該葉子頁
2.分裂一個(gè)索引頁只需要一次額外的同步讀,約10ms,葉子頁分裂會(huì)導(dǎo)致讀一個(gè)索引片變得更慢
3.索引重組是為了恢復(fù)索引行正確的物理位置,它對(duì)于索引片掃描和全索引掃描的性能而言很重要
十二、數(shù)據(jù)庫管理系統(tǒng)相關(guān)的索引限制
十三、數(shù)據(jù)庫索引選項(xiàng)
十四、優(yōu)化器不是完美的
1.完全避免由索引改進(jìn)導(dǎo)致性能下降的唯一方法是,對(duì)每一個(gè)SQL調(diào)用都使用提示
十五、其他評(píng)估事項(xiàng)
十六、組織索引設(shè)計(jì)過程
半寬索引:一個(gè)包含WHERE子句中所有列的索引,使用半寬索引將使得訪問路徑僅在必要時(shí)才訪問表
聚焦索引:在SQL Server中是指一個(gè)包含表行的索引,在DB2中是指任何一個(gè)索引行順序與表行順序相同或計(jì)劃相同的索引
聚簇索引:使得DBMS在向表中添加記錄時(shí),將新記錄添加至由聚簇索引鍵所定義的主頁上。一張表上只能有一個(gè)聚簇索引
覆蓋索引:指一個(gè)包含了SELECT語句所涉及的所有列的索引