鍵 索引 約束的理解及其區別

2022-08-13 21:18:12 字數 4108 閱讀 6819

今天下午剛好沒事,把一些基礎性的概念理順一下,存檔,省的麻煩,嘿嘿

一.索引

1.       什麼是索引?

索引是對資料庫表中一列或多列的值進行排序的一種結構。

在關係型資料庫中,索引是一種與表有關的資料庫結構,是事實存在的。它可以使對於表的select等等操作更加快速,相當於一本書的目錄。

對於一張表,如果我們想要找到某一列符合特定值的記錄,第一種方法是全表搜尋,匹配,然後把所有符合的記錄列出,但是這樣做會消耗大量資料庫系統時間,並造成大量磁碟i/o操作;第二種就是在表中建立索引,然後在索引中找到符合查詢條件的索引值,最後通過儲存在索引中的rowid(相當於頁碼)快速找到表中對應的記錄。

索引是乙個單獨的、物理的資料庫結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的資料頁的邏輯指標清單。由此可知,索引是要消耗資料庫空間的。

並非所有的資料庫都以相同的方式使用索引。作為通用規則,只有當經常查詢索引列中的資料時,才需要在表上建立索引。索引占用磁碟空間,並且降低新增、刪除和更新行的速度。在多數情況下,索引用於資料檢索的速度優勢大大超過它的不足之處。但是,如果應用程式非常頻繁地更新資料或磁碟空間有限,則可能需要限制索引的數量。

可以使用單列作為索引,也可以使用多列聯合作為索引。

2.    索引的優缺點

優點:(1)大大加快資料的檢索速度;   

(2)建立唯一性索引,保證資料庫表中每一行資料的唯一性;   

(3)加速表和表之間的連線;   

(4)在使用分組和排序子句進行資料檢索時,可以顯著減少查詢中分組和排序的時間。

缺點:(1)索引需要佔物理空間。   

(2)當對表中的資料進行增加、刪除和修改的時候,索引也要動態的維護,降低了資料的維護速度。

建立索引時的注意事項:

(1)   考慮已在表上建立的索參數量。最好避免在單個表上有很多索引

(2)   檢查已在表上建立的索引的定義。最好避免包含共享列的重疊索引

(3)   檢查某列中唯一資料值的數量,並將該數量與表中的行數進行比較。比如如果有1000w記錄,某字段為性別,只有男,女。也就是說一半的記錄都是重複的,這樣就要考慮是否還有必要建立索引了。

3.       一些索引類別

(1)       普通索引

也即不加任何限制的索引。可通過以下語句理解。

create table zjj_temp_1 (id number(10),first_name char(10),last_name char(10),age number(3),val number(10,2));

insert into zjj_temp_1 values(1,'junjie','zhang',25,4000);

select * from zjj_temp_1;

此時一條記錄已經插入進入了。

--------建立索引

insert into zjj_temp_1 values(1,'junjie','zhang',25,4000)

--------再次插入一條一模一樣的記錄

ok!兩條記錄出現了,也即此索引的作用是讓你再查詢first_name為某乙個特定值的記錄時速度更快而已,僅此而已。

(2)       唯一索引

一種索引,不允許具有索引值相同的行,從而禁止重複的索引或鍵值。系統在建立該索引時檢查是否有重複的鍵值,並在每次使用 insert 或 update 語句新增資料時進行檢查。

繼續分析例子:

drop index zjj_temp_index_1; ----刪除上文建立的普通索引。

create unique index zjj_temp_1 on zjj_temp_1(id);

----建立唯一索引

資料庫報錯了?

是的,說找到重複的關鍵字。

從上文我們可以看到,zjj_temp_1表中有兩條記錄,id都是1.

這樣是唯一索引是不允許的,所以自然就建立不起來了。

delete from zjj_temp_1 where rownum<2;  --刪除一行

create unique index zjj_temp_1 on zjj_temp_1(id);

----繼續建立,發現這次成功了。

insert into zjj_temp_1 values(2,'junjie','zhang',25,4000);

----成功

insert into zjj_temp_1 values(1,'kesi','ma',25,4000); 失敗!!!

耶!就是這樣!

(3)       主鍵索引

資料庫表經常有一列或列組合,其值唯一標識表中的每一行。該列稱為表的主鍵。它和唯一索引的共性在於都不允許有重覆記錄,區別在於,唯一索引是不限制null的,也就是說或可以有一條以上的null值插入,但是主鍵卻限定不能為空。

繼續執行語句:

insert into zjj_temp_1 values(null,'kesi','ma',25,4000);  ---成功

這就表明唯一索引是允許有空值的。

drop index zjj_temp_1; ---刪除唯一索引

alter table zjj_temp_1 add constraint zjsy_1 primary key(id);                  ---建立主鍵

我們可以發現id有一條記錄為空,所以是無法建立主鍵的。

刪除那條空記錄就可以了。

(4)       聚簇索引和非聚簇索引

聚簇索引也叫簇類索引,是一種對磁碟上實際資料重新組織以按指定的乙個或多個列的值排序。由於聚簇索引的索引頁面指標指向資料頁面,所以使用聚簇索引查詢資料幾乎總是比使用非聚簇索引快。每張表只能建乙個聚簇索引,並且建聚簇索引需要至少相當該錶120%的附加空間,以存放該錶的副本和索引中間頁。

聚簇是根據碼值找到資料的物理儲存位置,從而達到快速檢索資料的目的。oracle聚簇索引的順序就是資料的物理儲存順序,葉節點就是資料節點。非聚簇索引的順序與資料物理排列順序無關,葉節點仍然是索引節點,只不過有乙個指標指向對應的資料塊。由於聚簇索引要按照索引排序,所以乙個表最多只能有乙個聚簇索引,但可以使用多列。

oracle中的聚簇表是指兩個表有乙個字段完全相同,並且在業務中經常會按這個欄位為目標連線這兩個表,這時建立聚簇表,

兩個表公用乙個字段,能減少占用空間,並能明顯提高連線查詢速度。

這兩篇都有實際的例子,這裡就不再深入討論了。

建立聚簇索引的思想

1、大多數表都應該有聚簇索引或使用分割槽來降低對錶尾頁的競爭,在乙個高事務的環境中,對最後一頁的封鎖嚴重影響系統的吞吐量。   

2、在聚簇索引下,資料在物理上按順序排在資料頁上,重複值也排在一起,因而在那些包含範圍檢查(between、、>=)或使用group by或orderby的查詢時,一旦找到具有範圍中第乙個鍵值的行,具有後續索引值的行保證物理上毗連在一起而不必進一步搜尋,避免了大範圍掃瞄,可以大大提高查詢速度。   

3、在乙個頻繁發生插入操作的表上建立聚簇索引時,不要建在具有單調上公升值的列(如identity)上,否則會經常引起封鎖衝突。   

4、在聚簇索引中不要包含經常修改的列,因為碼值修改後,資料行必須移動到新的位置。   

5、選擇聚簇索引應基於where子句和連線操作的型別。

資料庫(外來鍵及其約束理解)

一 首先是外來鍵的定義 如果乙個欄位x在一張表 表一 中是主關鍵字,而在另外一張表 表二 中不是主關鍵字,則字段x稱為表二的外來鍵 換句話說如果關係模式r1中的某屬性集不是自己的主鍵,而是關係模式r2的主鍵,則該屬性集稱為是關係模式r1的外來鍵。二 主鍵表和外鍵表的理解 1 以公共關鍵字作主鍵的表為...

索引和約束的區別

constraint 約束被 db2 universal database db2 udb 用來對資料業務規則和資料完整性進行實施 維護。約束的作用範圍僅限在當前資料庫,通過檢索 資料庫目錄 和 命令方式 select from user constraints 可以檢視到約束資訊。如果想方便 快捷...

索引與約束的區別

1 主鍵索引和主鍵有什麼關係?主鍵索引是建立主鍵的時候系統自動建立的索引,主鍵要求不重複,不為空,但是他如何判斷有效率呢?當然是建索引了,老是全表遍歷還不瘋掉。所以建立主鍵會自動的建立主鍵索引。2 主鍵和唯一鍵的區別在於唯一鍵可以為空,主鍵不可以 3 建立唯一約束和唯一索引又什麼區別?同理,建立唯一...