数据库索引
數據庫索引
文章目錄
- 數據庫索引
- 定義
- 優缺點
- 索引類型
- 建立普通索引或組合索引
- 適合建立索引的情況
- 索引失效的sql
定義
索引是對數據庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問數據庫表中的特定信息。數據庫索引好比是一本書前面的目錄,能加快數據庫的查詢速度。索引分為聚簇索引和非聚簇索引兩種,聚簇索引是按照數據存放的物理位置為順序的,而非聚簇索引就不一樣了;聚簇索引能提高多行檢索的速度,而非聚簇索引對于單行的檢索很快。
本人對于索引理解較淺,如有錯誤或不足的地方,歡迎指正,共同學習。
優缺點
優點
-
在設計數據庫時,通過創建一個惟一的索引,能夠在索引和信息之間形成一對一的映射式的對應關系,增加數據的惟一性特點。
-
能提高數據的搜索及檢索速度,符合數據庫建立的初衷。
-
能夠加快表與表之間的連接速度,這對于提高數據的參考完整性方面具有重要作用。
-
在信息檢索過程中,若使用分組及排序子句進行時,通過建立索引能有效的減少檢索過程中所需的分組及排序時間,提高檢索效率。
-
建立索引之后,在信息查詢過程中可以使用優化隱藏器,這對于提高整個信息檢索系統的性能具有重要意義。
缺點
-
在數據庫建立過程中,需花費較多的時間去建立并維護索引,特別是隨著數據總量的增加,所花費的時間將不斷遞增。
-
在數據庫中創建的索引需要占用一定的物理存儲空間,這其中就包括數據表所占的數據空間以及所創建的每一個索引所占用的物理空間,如果有必要建立起聚簇索引,所占用的空間還將進一步的增加
-
在對表中的數據進行修改時,例如對其進行增加、刪除或者是修改操作時,索引還需要進行動態的維護,這給數據庫的維護速度帶來了一定的麻煩。
索引類型
根據數據庫的功能,可以在數據庫設計器中創建三種索引:唯一索引、主鍵索引和聚集索引。有關數據庫所支持的索引功能的詳細信息,請參見數據庫文檔。
提示:盡管唯一索引有助于定位信息,但為獲得最佳性能結果,建議改用主鍵或唯一約束。
唯一索引
UNIQUE create unique index 索引名 on 表名(表中的列[(length)]) alter table 表名 add UNIQUE 索引名 (表中的列[(length)])唯一索引是不允許其中任何兩行具有相同索引值的索引。當現有數據中存在重復的鍵值時,大多數數據庫不允許將新創建的唯一索引與表一起保存。數據庫還可能防止添加將在表中創建重復鍵值的新數據。例如,如果在employee表中職員的姓(lname)上創建了唯一索引,則任何兩個員工都不能同姓。
主鍵索引
PRIMARY KEY -- 建表時自接指定 alert table 表名 add primary key (表中的列[(length)])數據庫表經常有一列或多列組合,其值唯一標識表中的每一行。該列稱為表的主鍵。在數據庫關系圖中為表定義主鍵將自動創建主鍵索引,主鍵索引是唯一索引的特定類型。該索引要求主鍵中的每個值都唯一。當在查詢中使用主鍵索引時,它還允許對數據的快速訪問。
聚集索引
在聚集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同。一個表只能包含一個聚集索引。如果某索引不是聚集索引,則表中行的物理順序與鍵值的邏輯順序不匹配。與非聚集索引相比,聚集索引通常提供更快的數據訪問速度。聚集索引和非聚集索引的區別,如字典默認按字母順序排序(物理順序),讀者如知道某個字的讀音可根據字母順序快速定位(索引順序與物理順序相同)。因此聚集索引和表的內容是在一起的。如讀者需查詢某個生僻字,則需按字典前面的索引,舉例按偏旁進行定位,找到該字對應的頁數,再打開對應頁數找到該字。這種通過兩個地方而查詢到某個字的方式就如非聚集索引。
建立普通索引或組合索引
create index 索引名 on 表名(列名); create index 索引名 on 表名(列名1,列名2,..); -- 組合索引組合索引 最左前綴 原則
個人理解 例如 : create index index_abc on TEST_TAB(a,b,c); 相當于建立了 a, ab, abc 三組索引。
只要某查詢條件中包含復合索引中的第一個列,該查詢就會走索引,如果不包含,就不會走索引
有博主的實驗 https://blog.csdn.net/tw7752/article/details/44595281
適合建立索引的情況
- 經常作為查詢條件的列 (where)
- 經常用于表連接的列,如外鍵 (join)
- 經常用于排序的列 (order)
索引失效的sql
-
組合索引使用 or 索引失效 如 a=1 or b=2 or c=3
-
索引條件為 is null / is not null 索引失效(看清況,測試過 null 比較多時, not null 會走索引)
-
索引條件 like ‘%xxx’, 索引失效; like ‘xxxx%’ 索引生效
-
索引列參加計算 如 t.score/10 > 10 失效, 應改成 t.score > 10*10
-
索引列不要使用NOT ( != 、 <> )如 t.score! = 10 失效,改成:t.score > 10 or t.score < 10
-
索引列上發生類型轉換, 例如 VARCHAR2 類型的索引列 ,寫成 where id = 1 ,應該 改成 where id = ‘1’ ( oracle實驗)
最好是 看一下sql的執行計劃,看看是否走了索引。
Oracle查看sql執行計劃
explain plan for select xxx from tablename where xxx ;select * from table(dbms_xplan.display);索引的原理 請看大神博客 https://blog.csdn.net/sinat_30186009/article/details/52169057
組合索引設計 https://blog.csdn.net/bless2015/article/details/84035845
總結
- 上一篇: ctfmon是什么启动项_Win7启动项
- 下一篇: MySQL数据库索引查询