索引優化及原理

2021-08-20 10:17:25 字數 3367 閱讀 8576

oracle

之sql優化-索引的基本原理(一)。

1、索引的基本概念:

(1)建立索引的目的:

以索引小的io換取表的大io。

何時建立索引:

當訪問的資料塊少於表中20%的資料時,建議使用索引。

(2)索引的***

會使insert、delete速度變慢(索引個數多的話速度就會慢)。

對於update語句,需要先判斷是否要修改索引列。

(3)單字段索引和組合索引

在oracle9i之前,只有使用到索引的前導引用時才可以使用組合索引。

現在可以通過索引的跳躍式掃瞄來使用非前導引用的組合索引。

(4)oracle的rowid

rowid是直接指向單行的線路圖,不同的版本rowid的結構不同,不能對rowid進行硬編碼。

具體可看上面的原理圖。

2、使用索引時需要注意

(1)條件中使用不等於操作(<>,!=),將不會走索引,而是走全表掃瞄。

(2)條件中使用is null 或者is not null,也不會走索引,走全表掃瞄。字段可以使用預設值。

(3)條件中對字段使用函式,也不會走索引,除非是函式索引。

(4)比較不匹配的資料型別時,oracle可以幫我們自動做資料型別的轉換,但是oracle還是建議我們最好

使用轉換函式(to_char()、to_date()、to_number()等)做顯示的轉換。

3、索引的選擇性

(1)選擇性越高,索引返回的資料就越少。

(2)索引的群集因子越高,表中的資料按照這個索引欄位越有序,表中返回的資料塊就越少。

(3)索引的二元高度的每個級別需要單獨的io,如果索引中被刪除的行接近20~30%,需要重建索引。

降低二元高度;

資料庫快的尺寸越大,索引的二元高度就越小。

(4)索引的空間

索引的空間被重複利用的概率很小,有時索引的空間比表大。

4、索引的掃瞄方式

(1)全域性快速掃瞄索引(fast full scan):

使用hint提示中的index_ffs。索引相對於表的總體大小來說很小。如果在連線中只查詢索引的

連線鍵列時,通常都會執行快速全索引掃瞄。

(2)跳躍式掃瞄索引(skip scan):

允許優化器使用組合索引,即使索引的前導列沒有出現在where子句裡面。比全索引掃瞄要快得多。

(3)索引的全域性掃瞄(full scan);

(4)索引的範圍掃瞄(range scan)。

5、索引的型別及特點

(1)b——索引

如果索引的值都在索引中,就可以不訪問表,從而減少io量。

(2)位圖索引

適用於dss

系統,他使用較少基數(唯一鍵數目)列訪問非常大的表。

b-樹索引和點陣圖索引的比較:

b-樹索引的索引值中包含rowid,這樣oracle就可以在行級別上鎖定索引。

位圖索引被儲存為壓縮的索引值,其中包含乙個範圍的rowid,因此oracle必須針對乙個給定值鎖

定所有範圍內的rowid。這種鎖定可能在某些dml語句中造成死鎖。

位圖索引的限制:

a、基於代價的優化

b、當執行alter table 語句,並修改包含位圖索引的列時,位圖索引會失效。

c、不能用於任何型別的完整性檢查。

d、不能被宣告為唯一索引。

注意:不要在繁重的oltp環境中使用位圖索引。

建立位圖索引

?1

2createbitmapindexemp_***onemployees(***)

tablespace users;

(3)hash 索引

使用hash 索引必須使用hash群集。

(4)索引編排表

又稱為索引組織表,只有索引段,沒有資料段。

(5)反轉鍵索引

資料1234就被儲存為4321。不能對位圖索引和索引編排表進行反轉鍵處理。

此型別的索引可能比b-索引要慢2.5~3倍。

一般適用於磁碟數很少而插入很多的情況。

建立反序索引

?1

2create

unique

indexorder_reinxonorders(order_num,order_date)

tablespace users reverse;

(6)基於函式的索引

資料庫的引數:query_rewrite_enabled = true

建立函式索引(函式索引即可以是普通的b樹索引,也可以是點陣圖索引)?1

2create

indexemp_substr_empnoonemployees(substr(empno,1,2))

tablespace users;

(7)分割槽索引

本地索引:有字首和無字首。

全域性索引:有字首和無字首。

6、索引的快速重建

鎖表的情況

?1

alter

indexindex_name rebuild;

不鎖表的情況

?1

alter

indexindx_name rebuild online;

注:b樹索引:在b樹的葉節點中儲存索引欄位的值與rowid。

唯一索引和不唯一索引都只是針對b樹索引而言

復合索引:

oracle最多允許包含32個字段的復合索引。

MySQL優化(三) 索引原理及索引優化

b tree索引,它是目前關係型資料庫中查詢資料最為常用和有效的索引,大多數儲存引擎都支援這種索引。使用b tree這個術語,是因為mysql在create table或其它語句中使用了這個關鍵字,但實際上不同的儲存引擎可能使用不同的資料結構,比如innodb就是使用的b tree。中的b是指bal...

MySQL索引原理及查詢優化

其實在工作中有去優化mysql語句,但之前優化僅僅是降到能夠接受花費時間之下,並有很多可以繼續提供的空間。很多時候在優化完成之後sql,也並不能向外展示。故這裡將自己平時優化的sql方法記錄下來,並找到乙個總結優化sql的地方。索引原理 mysql的建立索引其實就像是字典的目錄有一定的相似之處,通過...

MySQL索引原理及慢查詢優化

通過不斷的縮小想要獲得資料的範圍來篩選出最終想要的結果,同時把隨機的事件變成順序的事件,也就是我們總是通過同一種查詢方式來鎖定資料。資料庫索引就是通過演算法提高查詢效率。磁碟io與預讀 考慮到磁碟io是非常高昂的操作,計算機作業系統做了一些優化,當一次io時,不光把當前磁碟位址的資料,而是把相鄰的資...