[點(diǎn)晴永久免費(fèi)OA]鍵、索引、約束的理解及其區(qū)別
今天下午剛好沒事,把一些基礎(chǔ)性的概念理順一下,存檔,省的麻煩,嘿嘿 一.索引 1. 什么是索引? 索引是對數(shù)據(jù)庫表中一列或多列的值進(jìn)行排序的一種結(jié)構(gòu)。 在關(guān)系型數(shù)據(jù)庫中,索引是一種與表有關(guān)的數(shù)據(jù)庫結(jié)構(gòu),是事實(shí)存在的。它可以使對于表的select等等操作更加快速,相當(dāng)于一本書的目錄。 對于一張表,如果我們想要找到某一列符合特定值的記錄,第一種方法是全表搜索,匹配,然后把所有符合的記錄列出,但是這樣做會消耗大量數(shù)據(jù)庫系統(tǒng)時間,并造成大量磁盤I/O操作;第二種就是在表中建立索引,然后在索引中找到符合查詢條件的索引值,最后通過保存在索引中的ROWID(相當(dāng)于頁碼)快速找到表中對應(yīng)的記錄。 索引是一個單獨(dú)的、物理的數(shù)據(jù)庫結(jié)構(gòu),它是某個表中一列或若干列值的集合和相應(yīng)的指向表中物理標(biāo)識這些值的數(shù)據(jù)頁的邏輯指針清單。由此可知,索引是要消耗數(shù)據(jù)庫空間的。 并非所有的數(shù)據(jù)庫都以相同的方式使用索引。作為通用規(guī)則,只有當(dāng)經(jīng)常查詢索引列中的數(shù)據(jù)時,才需要在表上創(chuàng)建索引。索引占用磁盤空間,并且降低添加、刪除和更新行的速度。在多數(shù)情況下,索引用于數(shù)據(jù)檢索的速度優(yōu)勢大大超過它的不足之處。但是,如果應(yīng)用程序非常頻繁地更新數(shù)據(jù)或磁盤空間有限,則可能需要限制索引的數(shù)量。 可以使用單列作為索引,也可以使用多列聯(lián)合作為索引。 2. 索引的優(yōu)缺點(diǎn) 優(yōu)點(diǎn): (1)大大加快數(shù)據(jù)的檢索速度; (2)創(chuàng)建唯一性索引,保證數(shù)據(jù)庫表中每一行數(shù)據(jù)的唯一性; (3)加速表和表之間的連接; (4)在使用分組和排序子句進(jìn)行數(shù)據(jù)檢索時,可以顯著減少查詢中分組和排序的時間。 缺點(diǎn): (1)索引需要占物理空間。 (2)當(dāng)對表中的數(shù)據(jù)進(jìn)行增加、刪除和修改的時候,索引也要動態(tài)的維護(hù),降低了數(shù)據(jù)的維護(hù)速度。 建立索引時的注意事項(xiàng): (1) 考慮已在表上創(chuàng)建的索引數(shù)量。最好避免在單個表上有很多索引 (2) 檢查已在表上創(chuàng)建的索引的定義。最好避免包含共享列的重疊索引 (3) 檢查某列中唯一數(shù)據(jù)值的數(shù)量,并將該數(shù)量與表中的行數(shù)進(jìn)行比較。比如如果有1000w記錄,某字段為性別,只有男,女。也就是說一半的記錄都是重復(fù)的,這樣就要考慮是否還有必要建立索引了。 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; 此時一條記錄已經(jīng)插入進(jìn)入了。 create index zjj_temp_index_1 on zjj_temp_1(first_name); --------建立索引 insert into zjj_temp_1 values(1,''junjie'',''zhang'',25,4000) --------再次插入一條一模一樣的記錄 select * from zjj_temp_1; Ok!兩條記錄出現(xiàn)了,也即此索引的作用是讓你再查找first_name為某一個特定值的記錄時速度更快而已,僅此而已。 (2) 唯一索引 一種索引,不允許具有索引值相同的行,從而禁止重復(fù)的索引或鍵值。系統(tǒng)在創(chuàng)建該索引時檢查是否有重復(fù)的鍵值,并在每次使用 INSERT 或 UPDATE 語句添加數(shù)據(jù)時進(jìn)行檢查。 繼續(xù)分析例子: drop index zjj_temp_index_1; ----刪除上文創(chuàng)建的普通索引。 create unique index zjj_temp_1 on zjj_temp_1(id); ----建立唯一索引 數(shù)據(jù)庫報錯了? 是的,說找到重復(fù)的關(guān)鍵字。 從上文我們可以看到,zjj_temp_1表中有兩條記錄,id都是1. 這樣是唯一索引是不允許的,所以自然就創(chuàng)建不起來了。 delete from zjj_temp_1 where rownum<2; --刪除一行 create unique index zjj_temp_1 on zjj_temp_1(id); ----繼續(xù)創(chuàng)建,發(fā)現(xiàn)這次成功了。 insert into zjj_temp_1 values(2,''junjie'',''zhang'',25,4000); ----成功 insert into zjj_temp_1 values(1,''kesi'',''ma'',25,4000); 失?。。?! 耶!就是這樣! (3) 主鍵索引 數(shù)據(jù)庫表經(jīng)常有一列或列組合,其值唯一標(biāo)識表中的每一行。該列稱為表的主鍵。它和唯一索引的共性在于都不允許有重復(fù)記錄,區(qū)別在于,唯一索引是不限制null的,也就是說或可以有一條以上的null值插入,但是主鍵卻限定不能為空。 繼續(xù)執(zhí)行語句: insert into zjj_temp_1 values(null,''kesi'',''ma'',25,4000); ---成功 select * from zjj_temp_1; 這就表明唯一索引是允許有空值的。 Drop index zjj_temp_1; ---刪除唯一索引 alter table zjj_temp_1 add constraint zjsy_1 primary key(id); ---建立主鍵 我們可以發(fā)現(xiàn)id有一條記錄為空,所以是無法建立主鍵的。 刪除那條空記錄就可以了。 (4) 聚簇索引和非聚簇索引 聚簇索引也叫簇類索引,是一種對磁盤上實(shí)際數(shù)據(jù)重新組織以按指定的一個或多個列的值排序。由于聚簇索引的索引頁面指針指向數(shù)據(jù)頁面,所以使用聚簇索引查找數(shù)據(jù)幾乎總是比使用非聚簇索引快。每張表只能建一個聚簇索引,并且建聚簇索引需要至少相當(dāng)該表120%的附加空間,以存放該表的副本和索引中間頁。
聚簇是根據(jù)碼值找到數(shù)據(jù)的物理存儲位置,從而達(dá)到快速檢索數(shù)據(jù)的目的。Oracle聚簇索引的順序就是數(shù)據(jù)的物理存儲順序,葉節(jié)點(diǎn)就是數(shù)據(jù)節(jié)點(diǎn)。非聚簇索引的順序與數(shù)據(jù)物理排列順序無關(guān),葉節(jié)點(diǎn)仍然是索引節(jié)點(diǎn),只不過有一個指針指向?qū)?yīng)的數(shù)據(jù)塊。由于聚簇索引要按照索引排序,所以一個表最多只能有一個聚簇索引,但可以使用多列。 ORACLE中的聚簇表是指兩個表有一個字段完全相同,并且在業(yè)務(wù)中經(jīng)常會按這個字段為目標(biāo)連接這兩個表,這時建立聚簇表, 這兩篇都有實(shí)際的例子,這里就不再深入討論了。 建立聚簇索引的思想 1、大多數(shù)表都應(yīng)該有聚簇索引或使用分區(qū)來降低對表尾頁的競爭,在一個高事務(wù)的環(huán)境中,對最后一頁的封鎖嚴(yán)重影響系統(tǒng)的吞吐量。 2、在聚簇索引下,數(shù)據(jù)在物理上按順序排在數(shù)據(jù)頁上,重復(fù)值也排在一起,因而在那些包含范圍檢查(between、<、<=、<>、>=)或使用group by或orderby的查詢時,一旦找到具有范圍中第一個鍵值的行,具有后續(xù)索引值的行保證物理上毗連在一起而不必進(jìn)一步搜索,避免了大范圍掃描,可以大大提高查詢速度。 3、在一個頻繁發(fā)生插入操作的表上建立聚簇索引時,不要建在具有單調(diào)上升值的列(如IDENTITY)上,否則會經(jīng)常引起封鎖沖突。 4、在聚簇索引中不要包含經(jīng)常修改的列,因?yàn)榇a值修改后,數(shù)據(jù)行必須移動到新的位置。 5、選擇聚簇索引應(yīng)基于where子句和連接操作的類型。 本文編輯:插秧機(jī),http://www.cgjfg.com/ 該文章在 2020/3/3 1:59:26 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |