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時,不光把當前磁碟位址的資料,而是把相鄰的資...