Oracle索引,看這篇就夠了
什麼是索引
索引是與表關聯的可選結構,是一種快速訪問資料的途徑,可提高資料庫效能。資料庫可以明確的建立索引,以加快對錶的執行sql語句的速度,當索引鍵作為查詢條件時,該索引將直接指向包含這些值的行的位置,即便刪除索引,也無需修改任何sql語句的定義
索引的分類
物理分類 | 邏輯分類 |
---|---|
分割槽或非分割槽索引 | 單列或組合索引 |
B樹索引 | 唯一或非唯一索引 |
正常或反向鍵索引 | 基於函式索引 |
點陣圖索引 |
B樹索引
B樹索引通常也稱為標準索引。索引的頂部為根
,其中包含指向索引中下一級的項。下一級為分之塊,分之塊又指向索引下一級的塊,最低一級為葉節點
,其中包含指向錶行的索引項。葉塊為雙向連結串列
,有助於按關鍵字的升序和降序掃描索引
SQL>create [unique] index_name on table_name(column_list)
[tablespace tablespace_name]
- unique
:用於指定唯一索引,預設情況下為非唯一索引
- index_name
:索引名
- table_name
:表名
- column_list
:列名,可以是多個列,使用逗號分隔
- tablespace_name
:為索引指定表空間
唯一索引和非唯一索引
- 唯一索引:
定義索引的列中任何兩行都沒有重複值。唯一索引中的索引關鍵字只能指向表中的一行。在建立主鍵約束和建立唯一約束時都會建立一個與之對應的唯一索引
- 非唯一索引:
單個關鍵字可以有多個與其關聯的行
反向鍵索引
與常規B樹索引相反,反向鍵索引在保持列順序的同時反轉列的位元組。反向索引通過反轉索引
鍵的資料值來實現,其優點是對於連續增長的索引列,反轉索引列可以將索引資料分散在多
個索引塊間,減少I/O瓶頸的發生。
SQL>create unique index_reverse_name on table_name(column_list) REVERSE;
REVERSE
點陣圖索引
點陣圖索引的優點在於,它最適於
低基數列
(該列的值是有限的,理論上不會是無窮大的)。列如,員工表中的工種(job列),即便是有幾百萬條員工記錄,工種也是可計算的,工種列可以作為點陣圖索引
,類似的還有圖書表類別列等。
點陣圖索引具有下列優點
- 對於大批即時查詢,可以減少響應時間
- 相比其他索引技術,佔用空間明顯減少
- 即使在配置很低的終端硬體,也能獲得顯著的效能
點陣圖索引不直接儲存rowId,而是儲存位元組位到rowId的對映,減少響應時間,節省空間佔用
點陣圖索引
不應當應用到頻繁發生insert
,update
,delete
操作的表上,這些DML操作在效能方面代價很高,點陣圖索引最適合於資料倉儲和決策支援系統
SQL>create bitmap index index_bit_name on table_name(column_name)
其它索引
- 組合索引:在表內多列上建立索引,索引中列不必與表中的列順序一致,也不必相互鄰接
- 使用場景:當某幾個欄位在SQL語句的where字句中經常通過and操作符聯合在一起使用作為過濾條鍵謂詞
- 複合索引欄位排序原則
- 最
頻繁
使用的欄位排在第一位 - 使用頻率相同,則將最具
選擇性
的欄位放在前面
- 最
- 基於函式索引:若使用的函式或表示式涉及正在建立的表中的一列或多列,則建立基於函式的索引,可以將給予函式的索引建立為B樹或點陣圖索引。
- 表示式中不能出現聚合函式,
- 不能在LOB型別的列上建立,
- 建立時必須具有QUERT REWRITE許可權
索引使用原則
- 表中匯入資料後在建立索引。否則每次表中插入資料都必須更新索引
- 在適當的表和欄位建立索引,如果經常檢索的資料少於表中的15%則需要建立索引
- 限制表中索引的數目,索引越多,在修改表時索引做出修改的工作量越大
總結
- B樹索引是一個通用索引,在建立索引時它就是預設索引型別
- 反向鍵索引建立在值是連續增長的列上
- 點陣圖索引適合建立在低基數列上
- 基於函式索引
- 索引使用原則
相關文章
- 索引?看這一篇就夠了!索引
- mongoDB看這篇就夠了MongoDB
- Android Fragment看這篇就夠了AndroidFragment
- OAuth授權|看這篇就夠了OAuth
- Zookeeper入門看這篇就夠了
- 小程式分享,看這篇就夠了
- JavaScript正則,看這篇就夠了JavaScript
- 入門Webpack,看這篇就夠了Web
- Git 看這一篇就夠了Git
- Transformer 看這一篇就夠了ORM
- MySQL索引優化看這篇文章就夠了!MySql索引優化
- 代理模式看這一篇就夠了模式
- Java 動態代理,看這篇就夠了Java
- python 操作 mysql 只看這篇就夠了PythonMySql
- 學透 Redis HyperLogLog,看這篇就夠了Redis
- Flutter DataTable 看這一篇就夠了Flutter
- 小程式入門看這篇就夠了
- 關於流量清洗,看這篇就夠了
- Java 集合看這一篇就夠了Java
- vue 元件通訊看這篇就夠了Vue元件
- EFCore 6.0入門看這篇就夠了
- ZooKeeper分散式配置——看這篇就夠了分散式
- java序列化,看這篇就夠了Java
- oracle 歷史檢視檢視,看這一篇就夠了Oracle
- 前端er瞭解GraphQL,看這篇就夠了前端
- 入門Hbase,看這一篇就夠了
- Python3入門,看這篇就夠了Python
- Redis主從複製看這篇就夠了Redis
- Spring入門看這一篇就夠了Spring
- Mybatis入門看這一篇就夠了MyBatis
- 熱門、常用API介面,看這篇就夠了API
- 關於SwiftUI,看這一篇就夠了SwiftUI
- 瞭解 MongoDB 看這一篇就夠了MongoDB
- flex佈局看這一篇就夠了Flex
- Android View繪製流程看這篇就夠了AndroidView
- Python操作MongoDB看這一篇就夠了PythonMongoDB
- 快應用入門,看這篇就夠了
- HashMap的實現原理(看這篇就夠了)HashMap