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
- 入門Webpack,看這篇就夠了Web
- Android Fragment看這篇就夠了AndroidFragment
- OAuth授權|看這篇就夠了OAuth
- Zookeeper入門看這篇就夠了
- Git 看這一篇就夠了Git
- React入門看這篇就夠了React
- JavaScript正則,看這篇就夠了JavaScript
- 小程式分享,看這篇就夠了
- MySQL索引優化看這篇文章就夠了!MySql索引優化
- Flutter DataTable 看這一篇就夠了Flutter
- 小程式入門看這篇就夠了
- Java 動態代理,看這篇就夠了Java
- vue 元件通訊看這篇就夠了Vue元件
- java序列化,看這篇就夠了Java
- 代理模式看這一篇就夠了模式
- EFCore 6.0入門看這篇就夠了
- ZooKeeper分散式配置——看這篇就夠了分散式
- Java 集合看這一篇就夠了Java
- 學習Less-看這篇就夠了
- [收藏]學習sed,看這篇就夠了
- 瞭解 MongoDB 看這一篇就夠了MongoDB
- 關於SwiftUI,看這一篇就夠了SwiftUI
- 前端er瞭解GraphQL,看這篇就夠了前端
- 入門Hbase,看這一篇就夠了
- macOS 安裝 Nebula Graph 看這篇就夠了Mac
- HashMap的實現原理(看這篇就夠了)HashMap
- jQuery入門看這一篇就夠了jQuery
- Elasticsearch入門,看這一篇就夠了Elasticsearch
- ActiveMq 之JMS 看這一篇就夠了MQ
- Redis主從複製看這篇就夠了Redis
- MySQL入門看這一篇就夠了MySql
- flex佈局看這一篇就夠了Flex
- Java NIO全面詳解(看這篇就夠了)Java
- 熱門、常用API介面,看這篇就夠了API
- Mybatis入門看這一篇就夠了MyBatis
- 快應用入門,看這篇就夠了
- python 操作 mysql 只看這篇就夠了PythonMySql