網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
一、B-樹(shù)索引
索引一般是B-Tree索引,在索引結(jié)構(gòu)中存儲(chǔ)著鍵值和鍵值的RowID,并且是一一對(duì)應(yīng)的。
create [unique] index studentin student(id [desc]);
選項(xiàng)擇索引字段的原則:
(ORACLE在UNIQUE和主鍵字段上自動(dòng)建立索引 。)
- 在WHERE子句中最頻繁使用的字段 。
- 聯(lián)接語(yǔ)句中的連接字段。
- 選擇高選擇性的字段(即如果很少的字段擁有相同值,即有很多獨(dú)特值,可以快速查找到所需數(shù)據(jù)的字段) .
- 在聯(lián)機(jī)事務(wù)處理(OLTP)環(huán)境下,所由并發(fā)性非常高,索引經(jīng)常被修改,可以建B-TREE索引,不應(yīng)該建位圖索引 。
- 不要在經(jīng)常被修改的字段上建索引,可建函數(shù)索引。
- 不要在有用到函數(shù)的字段上建索引。
- B-Tree索引不包含null的數(shù)據(jù)。?
可以建立一個(gè)“偽”復(fù)合索引解決。eg:也可以用函數(shù)索引將不想索引,即使不是null也可以剔除。eg:create index my_ix on my_table(my_col,0);
create index a on table(decode(status,0,0))--只關(guān)心少數(shù)status為0的行。
二、復(fù)合索引
索引可以包含一個(gè)、兩個(gè)或更多個(gè)列。兩個(gè)或更多個(gè)列上的索引被稱作復(fù)合索引。例如,以下語(yǔ)句創(chuàng)建一個(gè)具有兩列的復(fù)合索引:(復(fù)合索引列數(shù)量不超過(guò)32個(gè))
CREATE INDEX name ON employee (emp_lname, emp_fname)
復(fù)合索引的第一列稱為前導(dǎo)列(leading column)。
復(fù)合索引字段排序的原則:
- WHERE子句中使用到的字段需要是復(fù)合索引的前導(dǎo)字段,若僅對(duì)后面的任意列執(zhí)行搜索時(shí),則應(yīng)該創(chuàng)建另一個(gè)僅包含第二列的索引。
- 如果某個(gè)字段在WHERE子句中最頻繁使用,則在建立復(fù)合索引時(shí),考慮把這個(gè)字段排在第一位(在CREATE INDEX語(yǔ)句中)
- 如果所有的字段在WHERE子句中使用頻率相同,則將低選擇性列排在最前面,將選擇性較強(qiáng)的列排在最后面
- 如果所有的字段在WHERE子句中使用頻率相同,如果數(shù)據(jù)在物理上是按某一個(gè)字段排序的,則考慮將這個(gè)字段放在復(fù)合索引的第一位 。
- 在主鍵索引(復(fù)合主鍵)中列的順序被強(qiáng)制為與列在表定義中出現(xiàn)的順序相同,這與 PRIMARY KEY 約束中指定的列順序無(wú)關(guān).
- 索引列的排序方式必須與 ORDER BY 子句完全相同或完全相反。否則不能得到性能優(yōu)化。
CREATE INDEX idx_example ON table1 (col1 ASC, col2 DESC, col3 ASC)
在這種情況下,以下查詢可以得到優(yōu)化:
SELECT col1, col2, col3 from table1 ORDER BY col1 ASC, col2 DESC, col3 ASC
和
SELECT col1, col2, col3 from example ORDER BY col1 DESC, col2 ASC, col3 DESC
- 復(fù)合索引的前導(dǎo)字段is (not) null 可以使用索引。
三、位圖索引
創(chuàng)建語(yǔ)法是在普通索引創(chuàng)建的語(yǔ)法中index前加關(guān)鍵字bitmap即可,例如:
create bitmap index t_ix_執(zhí)行人 on t(執(zhí)行人);
位圖索引主要針對(duì)大量相同值的列而創(chuàng)建(例如:類別,操作員,部門(mén)ID,庫(kù)房ID等)。
索引塊的一個(gè)索引行中存儲(chǔ)鍵值和起止Rowid,以及這些鍵值的位置編碼。
位圖索引存儲(chǔ)數(shù)據(jù)的方式相對(duì)于B-Tree索引,占用的空間非常小,創(chuàng)建時(shí)不需要排序,定位存儲(chǔ),創(chuàng)建和使用非常快。
位圖索引的特點(diǎn):
- Bitmap索引允許鍵值為空,對(duì)位圖索引列進(jìn)行is(not) null查詢時(shí),則可以使用索引。
- Bitmap索引對(duì)表記錄的高效訪問(wèn)。當(dāng)使用count(XX),可以直接訪問(wèn)索引就快速得出統(tǒng)計(jì)數(shù)據(jù)。當(dāng)根據(jù)位圖索引的列進(jìn)行and,or或 in(x,y,..)查詢時(shí),直接用索引的位圖進(jìn)行或運(yùn)算。
- Bitmap索引對(duì)批量DML操作只需進(jìn)行一次索引。
- 位圖索引由于用位圖反映數(shù)據(jù),不同會(huì)話更新相同鍵值的同一位圖段,insert、update、delete相互操作都會(huì)發(fā)鎖定(未提交時(shí))。
- 由于并發(fā)DML操作鎖定的是整個(gè)位圖段的大量數(shù)據(jù)行,所以位圖索引主要是用于聯(lián)機(jī)分析處理(OLAP)應(yīng)用。
四、函數(shù)索引
比如執(zhí)行如下一條SQL語(yǔ)句:
select * from emp where upper(ename) = 'KING',
即使在ename上建立了索引,還是會(huì)全表掃描emp表,將里面的ename字段改成大寫(xiě)跟常量KING進(jìn)行比較。?
如果我們建立一個(gè)基于函數(shù)的索引,比如:
create index emp_upper_idx on emp(upper(ename));
這個(gè)時(shí)候,我們只需要按區(qū)間掃描小部分?jǐn)?shù)據(jù),然后獲取rowid取訪問(wèn)表中的數(shù)據(jù),這個(gè)速度是比較快的。
函數(shù)索引的特點(diǎn):
- 基于函數(shù)的索引,類似于普通的索引,只是普通的索引是建立在列上,而它是建立在函數(shù)上。當(dāng)然這回對(duì)插入數(shù)據(jù)有一定影響,因?yàn)樾枰ㄟ^(guò)函數(shù)計(jì)算一下,然后生成索引。但是插入數(shù)據(jù)一般都是少量插入,而查詢數(shù)據(jù)一般數(shù)據(jù)量比較大。為了優(yōu)化查詢速度,稍微降低點(diǎn)插入速度是可以承擔(dān)的。
- 函數(shù)索引還有一個(gè)功能,只對(duì)部分行建立索引。?
假設(shè)有一個(gè)很大的表,有一列叫做FLAG,只可能取Y和N。假設(shè)大部分?jǐn)?shù)據(jù)是Y,小部分?jǐn)?shù)據(jù)是N,我們需要將N修改成Y。
如果建立一個(gè)普通索引,這個(gè)索引會(huì)非常大,而且將N修改成Y的時(shí)候,維護(hù)這個(gè)索引開(kāi)銷會(huì)很大。
如果建立一個(gè)位圖索引,但這是一個(gè)事務(wù)系統(tǒng)(OLTP),可能有很多人同時(shí)插入記錄,或者進(jìn)行修改。那么位圖索引也不適合。所以,如果我們只是在值為N的行上建立索引,就比較好辦了。?
只在值為N的行建立索引:
create index flag_index on big_table(case flag when 'N' then 'N' end);
這樣一個(gè)索引大小會(huì)大大降低,而且維護(hù)成本也會(huì)很低的。前提是我們只對(duì)值為N的行感興趣。
五、維護(hù)索引
- 字典表:all_indexes、user_indexes
- 重建索引:alter index dep_idx rebuild [online]
- 刪除索引:drop index dep_idx;
原文鏈接:https://www.cnblogs.com/springsnow/p/9394720.html
相關(guān)推薦
- 2023-04-07 React?useContext與useReducer函數(shù)組件使用_React
- 2022-07-10 Popconfirm氣泡確認(rèn)框無(wú)法觸發(fā)confirm函數(shù)
- 2022-11-20 Python實(shí)現(xiàn)Tracert追蹤TTL值的方法詳解_python
- 2022-03-31 C語(yǔ)言與C++項(xiàng)目實(shí)現(xiàn)相互調(diào)用_C 語(yǔ)言
- 2022-07-29 C++數(shù)據(jù)結(jié)構(gòu)之單鏈表的實(shí)現(xiàn)_C 語(yǔ)言
- 2022-10-23 Android實(shí)現(xiàn)底部滾輪式選擇彈跳框_Android
- 2023-03-05 Go語(yǔ)言學(xué)習(xí)之golang-jwt/jwt的教程分享_Golang
- 2024-04-08 Spring在多線程環(huán)境下如何確保事務(wù)一致性
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支