索引(index)
前言:大學一次考試,因為是一門考查課,平時都沒怎麼學習,但是卻要做一張考試卷,於是大家都慌了,各自準備了自己的小抄,每個人足足有20多頁(誇張手法),機智的小彪在小抄第一頁寫了一個目錄,分別標記了,後面的知識點和頁碼,而傻正就蠢的一批,並沒有做目錄,然後考試了,在老師低頭的一刹那,小彪查看目錄找到了這道題的對應的頁碼,然後翻到這一頁,然後穩一會,老師再次低頭,我就開始狂抄。然而傻正就沒有這麼幸運了,還在拚命的一頁一頁翻,最後果然不出所料,哈哈哈哈哈,被老師收了小紙條,當然還是有機會考試的,畢竟是考查課。
–從以上情景故事中可以看出兩個問題1.傻正同學好像不那麼聰明(*委婉手法);
2.目錄在我們做查詢資訊的時候是多麼的重要。
主要是太無聊了,所以扯了以上的閑話,那麼久介紹今天的主題–索引
1.說明:(1)索引在資料庫中就好比我們生活中的目錄,我們可以通過所以直接定位到某一行或多行資料,極大提高查詢的速度。
(2)索引是獨立於我們建立的表的,他可以儲存在與表不同的磁碟或資料表空間中,是由資料庫管理系統所管理的;
(3)索引被刪除或者是破壞是不會影響到資料表的,只能影響到資料的查詢速度;
(4)索引的使用是由資料庫控制的,我們無須在查詢時指定索引;
(5)刪除一個表時,其對應的索引也會被相應的刪除;
(6)索引通過指標直接指向資料,快速定位,減少了磁碟io;
2.索引的建立與維護
索引又分為當行索引和複合索引
(1)單行索引
單行索引是指一個索引只指向某一列;
在oracle中,我們在建立表的時候,如果該列被添加了主鍵約束或者唯一約束,則資料庫系統會自動幫我們建立所在列的序列。無需我們手動建立;
如果我們想要在非唯一的列上建立索引則可以通過
create index 索引名 on 表名 (列名);
eg:create index user_index on users (uname);
(2)複合索引
複合索引就是同時將一個索引建立在多個列上
create index index_name on table_name (col_name1,col_name2,col_name3);
但是使用複合索引有幾個注意事項,從別的部落格上看到的,這裡提一下:
Create Index i_deptno_job on emp(deptno,job); —>在emp表的deptno、job列建立索引。
select * from emp where deptno=66 and job=’sals’ ->走索引。
select * from emp where deptno=66 OR job=’sals’ ->將進行全表掃描。不走索引
select * from emp where deptno=66 ->走索引。
select * from emp where job=’sals’ ->進行全表掃描、不走索引。
如果在where 子句中有OR 操作符或單獨引用Job 列(索引列的後面列) 則將不會走索引,將會進行全表掃描。
3.查詢索引
可以使用資料字典視圖 USER_INDEXES 和 USER_IND_COLUMNS 查看索引的資訊
eg:
SELECT ic.index_name, ic.column_name,ic.column_position col_pos,ix.uniqueness
FROM user_indexes ix, user_ind_columns ic
WHERE ic.index_name = ix.index_name
AND ic.table_name = users;
4.刪除索引
DROP INDEX INDEX_NAME;
特別說明:只有索引的擁有者和擁有drop any index 許可權的使用者才可以刪除;
5何時使用索引(索引優缺點)
想來想去還是要把這點放到最後寫了,通過前面的介紹,我們對索引的使用維護基本都掌握了,現在介紹一下也是很重要的問題,我們既然說索引能提高查詢效率,那麼是不是任何時候我們都去建立索引呢,答案肯定是否定的(一般來說這種任何性的答案都是錯的),下面簡單介紹下索引使用規則。
當然了對於那些唯一性的列,系統已經幫我們建立好了,我們一般還是不會刪的,這裡主要考慮的還是什麼時候手動建立索引。
(1)什麼時候建立索引。
答: 當列經常出現在where子句中或者串連條件的時候; 列中的資料分布範圍很廣,比如1-1000000,一個一個遍曆效率就太低了; 表經常被訪問而且資料量很大 ,訪問的資料大概占資料總量的2%到4%。
(2)什麼時候不建立索引。
- 一般表比較小的時候肯定就不建立了,即表資料量很小;
- 對於表經常更新的;
- 對於並不怎麼作為串連條件或者order by或where子句中出現的;
- 對於訪問的資料量大於%4的;
- 以上4中不見建議建立索引的原因都是一個:首先查詢肯定還是會快點,但是資料庫還是需要維護索引的,在這些情況下維護一個索引的成本是非常高的。所以弊大於利,不建議使用索引。
如有問題,歡迎指出,謝謝。