資料庫索引 索引優化

2021-09-22 08:24:11 字數 2590 閱讀 5786

二、 三星索引

三、 合適設計理想索引

謂詞簡單謂詞和複雜謂詞

where字句中的每個條件稱為乙個謂詞。

過濾因子

描述了謂詞的選擇性,即表中滿足謂詞條件的記錄行數所佔的比例

過濾因子(ff)= 結果集的數量 / 錶行的數量

平均過濾因子 =

1/ 不同列值的數量

索引片及匹配列

乙個索引定義乙個索引片,如果where字句中有第二個列,而這個列也在索引上,從而使得這兩個列能夠一同定義乙個更窄的索引片,這兩個列叫做匹配列

這樣不僅顯著減少了索引的處理量,更是減少了對標進行同步讀的次數。

索引過濾及過濾列

並不是所有的索引列都可參與索引片的定義。

所有的匹配列參與匹配過程——定義索引片。

過濾列參與了索引片的過濾過程,無法參與匹配過程,只能使索引片更厚。

判斷謂詞能否參與匹配和過濾?

星級評定

可以看出,我們的理想索引一定能有第三顆星,但只能有第一顆或者第二顆星。

設計最佳索引

method a

取出等值謂詞作為起始列,任意順序

將選擇性最好的範圍謂詞作為下乙個列,只考慮不過分複雜的範圍謂詞

以正確順序新增order by列,有desc則加上,忽略1和2步中已經新增的列

以任意順序將select語句中其餘的列新增至索引中,不易變的列放在前面

eg.(city, lname, fname, cno)

method b

取出等值謂詞作為起始列,任意順序

以正確順序新增order by列,有desc則加上,忽略1步中已經新增的列

以任意順序將select語句中其餘的列新增至索引中,不易變的列放在前面

eg.(city, fname, lname, cno)並不是所有的查詢語句都需要設計理想的最佳索引。

根據上面說的,為每個查詢設計最佳索引的過程是機械式的,只要給出以下內容就可以自動完成整個過程:

查詢語句

資料庫統計資訊(行數,頁數,列值分布等等)

對於每乙個簡單謂詞或組合謂詞最差情況下的過濾因子

已經存在的索引(只是避免生成重複索引)

多餘的索引

我們為查詢語句設計了乙個最佳索引後,去看一下已經存在的索引是很有必要的,我們不可能會完全按照機械式的方式去建立索引。有可能某乙個已經存在的索引幾乎和理想索引差不多好用,特別是打算在這個已有索引的最後新增一些列的情況下。

當分析乙個已經存在的索引對乙個新的查詢有多大用處,是否真的需要新建理想索引時,可以從這三種多餘索引來看,考慮一種新的折中的索引方式:

建新索引的代價

如果乙個表上有100個不同的查詢,且為每乙個索引都設計了最佳索引的話,那麼即使沒有重複索引,該錶上最終也可能有非常多的索引。這樣一來表的插入,更新和刪除操作就會變得很慢。我們一般從三個方面來討論,建立乙個新的索引要付出的代價。

響應時間

當我們向表中新增一行資料,它必須在每乙個索引上都新增相應的行,在乙個索引上新增一行耗時10ms(從磁碟讀取乙個葉子頁),在10個索引上每個索引新增20行就耗時1.8s(主鍵索引維護在同乙個索引頁)。

所以從響應時間的角度來看,在乙個擁有許多索引的大表上進行事務操作,可能是無法忍受的。

磁碟負載

由於資料庫的非同步寫不會影響到事務響應時間,但是這些寫會增加磁碟負載。在緩衝區中被修改過的頁是會遲早被寫到磁碟上去的,當一張表插入或更新頻率較高,緩衝區空閒空間變少或髒頁過多,會使得從緩衝區寫回磁碟的操作也會變頻繁,這時帶來的磁碟壓力也會變大。而且當索引較多時,向表中插入或更新多行資料也會同時更新多個索引頁上的行,磁碟繁忙時間會很久。

從磁碟負載的角度來看,乙個插入頻度較低的表,能夠容忍在表上建許多索引,索參數量取決於插入事務對響應時間的要求。如果磁碟負載是問題,較明顯的解決辦法是嘗試合併索引。乙個有10個列的索引比兩個各有6個列的索引所引起的磁碟負載要小。

磁碟空間

如果一張表中有1000萬行以上的資料,多個索引的磁碟空間成本可能會成為乙個問題。即使我們不考慮磁碟空間的成本問題,隨著索引變大,緩衝池或磁碟快取也應隨之增大,否則存在磁碟上會使非葉子頁的i/o量會增加,所以非葉子頁的記憶體開銷也不少。

參考:《索引設計與優化》

資料庫優化 索引

鑑於csdn無故刪除博文,本部落格不再更新,暫時遷至 2索引每一本書的前幾頁一般都是目錄,而最後幾頁通常會有乙個關鍵字索引。對於資料庫來講系統表 如 sysobjects等 就是目錄,而標字段上的索引就如同書本後面的關鍵字索引。資料庫中,目錄 資料字典 和索引的區別 目錄縱向 索引橫向。優化器根據統...

資料庫索引優化

索引的作用是告訴儲存引擎快速找到我們需要的資料,兩個極端,除了主鍵沒有任何索引,給每乙個列都建立乙個索引,所以索引是在mysql儲存引擎層實現的,而不是在mysql伺服器層實現的,不同的儲存引擎的索引方式是不同的,mysql支援的索引型別,b tree索引是比較常見的,通常所說的索引就是b tree...

資料庫索引優化

在本文中,使用如下的表tb test作為示例進行說明 create table tb test id int notnull,age int notnull,name varchar 30 not null,addr varchar 50 not null create unique index i...