二十五、索引:加快檢索速度的資料庫物件
阿新 • • 發佈:2018-12-02
索引:加快檢索速度的資料庫物件
資料庫物件:表、檢視、序列、索引、同義詞、約束、儲存過程、儲存函式、包和包體、觸發器
1、索引簡介
1)索引是資料庫物件之一,用於加快資料的檢索,類似於書籍的索引。在資料庫中索引可以減少資料庫程式查詢結果時需要讀取的資料量,類似於在書籍中我們利用索引可以不用翻閱整本書即可找到想要的資訊。 2)索引是建立在表上的可選物件;索引的關鍵在於通過一組排序後的索引鍵來取代預設的全表掃描檢索方式,從而提高檢索效率 3)索引在邏輯上和物理上都與相關的表和資料無關,當建立或者刪除一個索引時,不會影響基本的表; 4)索引一旦建立,在表上進行DML操作時(例如在執行插入、修改或者刪除相關操作時),oracle會自動管理索引,索引刪除,不會對錶產生影響 5)索引對使用者是透明的,無論表上是否有索引,sql語句的用法不變 6)oracle建立主鍵時會自動在該列上建立索引
2、索引原理
1)若沒有索引,搜尋某個記錄時(例如查詢name='wish')需要搜尋所有的記錄,因為不能保證只有一個wish,必須全部搜尋一遍
2)若在name上建立索引,oracle會對全表進行一次搜尋,將每條記錄的name值哪找升序排列,然後構建索引條目(name和rowid),儲存到索引段中,查詢name為wish時即可直接查詢對應地方
3)建立了索引並不一定就會使用,oracle自動統計表的資訊後,決定是否使用索引,表中資料很少時使用全表掃描速度已經很快,沒有必要使用索引
2.1、告訴你,為什麼使用了索引會變快?
根據索引的列,根據rowID進行升序排列,查詢的時候,根據rowID去查詢。 使用索引查一條資料,需要先訪問索引的資料,然後再訪問表的資料,兩次讀操作
2.2、不使用索引怎麼查詢?
資料庫會進行全表查詢
2.3、告訴你,為什麼使用了索引會變慢?
查詢結果佔到表資料的50%以上,使用索引必然慢
一次讀操作可以讀多條資料,索引的結構又比表複雜
可能查詢結果佔到表資料的20%以上,使用索引就不如全表掃描了
3、索引使用(建立、修改、刪除、檢視)
3.1、建立索引語法
CREATE [UNIQUE] | [BITMAP] INDEX index_name --unique表示唯一索引 ON table_name([column1 [ASC|DESC],column2 --bitmap,建立點陣圖索引 [ASC|DESC],…] | [express]) [TABLESPACE tablespace_name] [PCTFREE n1] --指定索引在資料塊中空閒空間 [STORAGE (INITIAL n2)] [NOLOGGING] --表示建立和重建索引時允許對錶做DML操作,預設情況下不應該使用 [NOLINE] [NOSORT]; --表示建立索引時不進行排序,預設不適用,如果資料已經是按照該索引順序排列的可以使用
3.2、修改索引
3.2.1、重新命名索引
alter index index_sno rename to bitmap_index;
3.2.2、合併索引(表使用一段時間後在索引中會產生碎片,此時索引效率會降低,可以選擇重建索引或者合併索引,合併索引方式更好些,無需額外儲存空間,代價較低)
alter index index_sno coalesce;
3.2.3、重建索引
方式一:刪除原來的索引,重新建立索引
方式二:alter index index_sno rebuild;
3.2.4、刪除索引
drop index index_sno;
3.2.5、檢視索引
select index_name,index-type, tablespace_name, uniqueness from all_indexes where table_name ='tablename';
-- eg:
create index index_sno on student('name');
select * from all_indexes where table_name='student';
4、注意事項
4.1、萬用字元在搜尋詞首出現時,oracle不能使用索引
--我們在name上建立索引;
create index index_name on student('name');
--下面的方式oracle不適用name索引
select * from student where name like '%wish%';
--如果萬用字元出現在字串的其他位置時,優化器能夠利用索引;如下:
select * from student where name like 'wish%';
4.2、不要在索引列上使用not,可以採用其他方式代替如下:(oracle碰到not會停止使用索引,而採用全表掃描)
select * from student where not (score=100);
select * from student where score <> 100;
--替換為
select * from student where score>100 or score <100
4.3、索引上使用空值比較將停止使用索引
select * from student where score is not null;
5、索引分類
5.1、B樹索引(B-TREE INDEX)
B樹索引結構圖:
B樹索引結構主要由三部分組成:根節點、分支節點、葉子節點。
對於oracle而言,索引的層級號採用倒序的方式,既對於層級數為N的索引,根節點的層級號為N,其下一層的分支節點為N-1,類推。