鑑於csdn無故刪除博文,本部落格不再更新,暫時遷至
2索引每一本書的前幾頁一般都是目錄,而最後幾頁通常會有乙個關鍵字索引。對於資料庫來講系統表(如:sysobjects等)就是目錄,而標字段上的索引就如同書本後面的關鍵字索引。
資料庫中,目錄(資料字典)和索引的區別:目錄縱向、索引橫向。
優化器根據統計資訊來生成執行計畫,如果資料庫沒有收集索引的統計資訊,優化器就無從下手,只能按部就班,通過全表掃瞄來執行查詢。所以,新建立的索引需要重新執行統計,否則索引無效。
舉乙個例子,有個表table1,其中有乙個欄位col1取值是「1」、「2」、「3」三種,執行統計的結果是告訴資料庫table1中的資料其中欄位col1的各種取值所佔的比重。示意如下:
「1」 - 12%;
「2」 - 66%;
「3」 - 22%。
假設還有個字段col2取值和資料所佔的百分比如下:
「a」 - 50%;
「b」 - 50%。
則查詢語句1:
select * from table1 where col1 = 「1」and col2 = 「a」,
資料庫優化器會優先選擇欄位col1上的索引來定位表中的資料,因為通過col1上的索引就可以將結果集迅速定位在乙個小範圍內12%。而相反的,對於查詢語句2:
select * from table1 where col1 = 「2」and col2 = 「a」,
資料庫會優先選擇col2上的索引,因為對於語句2的查詢條件col2上的索引具有更好的區分度。
從上面可以看出,資料庫的優化器通常會優先選擇區分度較高的索引(針對於查詢條件,條件不同選擇的索引可能不同)。
資料庫裡的資料是變化的,所以某個時候採集的統計資訊,過一段時間後可能會過時,甚至誤導資料庫優化器,這樣同樣會造成執行效能的低下。所以除了,最初建立索引時需要執行統計,在表中的資料發生變化時也需要執行統計。經驗:當表中資料量變化達到10%時,需要重新執行統計。
範圍掃瞄
小型表中大型表
超大型表
oltp和olap
函式,like語句。。。
substring(col_name,1, 3)vs. substring(col_name, 3, 3)
like 『qqq% vs. like 『%qqq』
效能利器
雙刃劍索引對插入操作的影響(oracle)
索引對插入操作的影響(mysql)
比較索引與促髮器對效能的影響
使用索引實現關鍵資料的高效訪問。但是需要知道每個索引都會給資料庫更新帶來額外的開銷。這就意味著,低效的索引會給資料庫帶來災難。
對於資料庫,我們必須關注關鍵資料的讀取,為他們提供最高效的訪問路徑。對此,基本策略就是建立索引。在索引提供高效訪問的同時,也帶來了額外的系統開銷。開銷分為磁碟空間的開銷和處理器開銷。下面我們討論一下處理器開銷。每當在表中插入或刪除記錄時,該錶的所有索引必須進行相應調整。每當對已建立索引的字段進行更新時,這種調整也會發生。舉例子說,如果在未建立索引的表中插入資料需要100個單位時間,那麼每增加乙個索引就會增加100到250個單位時間。有趣的是,維護索引的開銷與簡單觸發器帶來的開銷大致相當。
1. 當要在乙個合理的時間內結束查詢時,應避免新增索引,因為索引會降慢更新操作的速度並消耗額外的空間。有時候還可能存在覆蓋好幾個查詢的大型索引。
2. 基數較大的列很適合用來做索引。
3. 考慮到管理上的開銷,應避免在索引中使用多於5個的列。
4. 對於多列索引,將查詢中引用最多的列放在定義的前面。
5. 避免新增與已有的索引相似的索引。因為這樣會給優化器帶來更多的工作,並且會降慢更新操作的速度。相反,我們應該修改已有的索引,使其包含附加的列。例如,假設在乙個表的 (c1,c2)上有乙個索引i1。您注意到查詢中使用了"wherec2=?",於是又建立乙個(c2)上的索引i2。但是這個相似的索引沒有新增任何東西,它只是i1的冗餘,而現在反而成了額外的開銷。
6. 如果表是唯讀的,並且包含很多的行,那麼可以嘗試定義乙個索引,通過create index中的include子句使該索引包含查詢中引用的所有列(被include子句包含的列並不是索引的一部分,而只是作為索引頁的一部分來儲存,以避免附加的資料fetches)。
對於資料倉儲(查詢系統資料庫)可以建立較多的索引(索引和資料的比例可以是1:1)。
決定是否使用索引,可以重點考慮檢索比率。即,判斷索引有效性的依據,就使用鍵值作唯一性條件檢索出的資料的百分比。百分比越低,索引越有效。做出這個論斷的前提是一些假設,如磁碟訪問的相關效能。
索引鍵值相關記錄的物理位置是否相鄰也很重要,因為是通過塊來運算元據的。建立了索引之後,如果索引鍵所指向的記錄散布於整個表中,即使這些記錄在表中佔的比率很小,但因為它們分散在整個磁碟上,所以索引的效能就會大打折扣。
另外值得注意的是,函式和型別轉換可能導致索引失效。
資料庫索引 索引優化
二 三星索引 三 合適設計理想索引 謂詞簡單謂詞和複雜謂詞 where字句中的每個條件稱為乙個謂詞。過濾因子 描述了謂詞的選擇性,即表中滿足謂詞條件的記錄行數所佔的比例 過濾因子 ff 結果集的數量 錶行的數量 平均過濾因子 1 不同列值的數量 索引片及匹配列 乙個索引定義乙個索引片,如果where...
資料庫索引優化
索引的作用是告訴儲存引擎快速找到我們需要的資料,兩個極端,除了主鍵沒有任何索引,給每乙個列都建立乙個索引,所以索引是在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...