更新時(shí)間:2016年09月26日09時(shí)48分 來源:傳智播客Java培訓(xùn)學(xué)院 瀏覽次數(shù):
使用索引可快速訪問數(shù)據(jù)庫表中的特定信息。索引是對數(shù)據(jù)庫表中一列或多列的值進(jìn)行排序的一種結(jié)構(gòu), 與必須搜索表中的所有行相比,索引會(huì)
幫助您更快地獲得該信息。
索引提供指向存儲(chǔ)在表的指定列中的數(shù)據(jù)值的指針,然后根據(jù)您指定的排序順序?qū)@些指針排序。數(shù)據(jù)庫使用索引的方式與您使用書籍中的索引
的方式很相似:它搜索索引以找到特定值,然后順指針找到包含該值的行。
作為通用規(guī)則,只有當(dāng)經(jīng)常查詢索引列中的數(shù)據(jù)時(shí),才需要在表上創(chuàng)建索引。索引占用磁盤空間,并且降低添加、刪除和更新行的速度。
如果經(jīng)常同時(shí)搜索兩列或多列或按兩列或多列排序時(shí),索引也很有幫助。例如,如果經(jīng)常在同一查詢中為姓和名兩列設(shè)置判據(jù),那么在這兩列上
創(chuàng)建多列索引將很有意義。
索引類型
根據(jù)數(shù)據(jù)庫的功能,可以在數(shù)據(jù)庫設(shè)計(jì)器中創(chuàng)建四種索引:唯一索引、主鍵索引和聚集索引、非聚集索引。
a.唯一索引
唯一索引是不允許其中任何兩行具有相同索引值的索引。
b.主鍵索引
數(shù)據(jù)庫表經(jīng)常有一列或列組合,其值唯一標(biāo)識(shí)表中的每一行,該列稱為表的主鍵。
在數(shù)據(jù)庫關(guān)系圖中為表定義主鍵將自動(dòng)創(chuàng)建主鍵索引,主鍵索引是唯一索引的特定類型。該索引要求主鍵中的每個(gè)值都唯一。
c.聚集索引
在聚集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同。一個(gè)表只能包含一個(gè)聚集索引。
如果某索引不是聚集索引,則表中行的物理順序與鍵值的邏輯順序不匹配。與非聚集索引相比,聚集索引通常提供更快的數(shù)據(jù)訪問速度。
d.非聚集索引
非聚集索引指定表的邏輯順序。數(shù)據(jù)存儲(chǔ)在一個(gè)位置,索引存儲(chǔ)在另一個(gè)位置,索引中包含指向數(shù)據(jù)存儲(chǔ)位置的指針??梢杂卸鄠€(gè),小于249個(gè)。
主鍵選擇原則:
(1)主鍵設(shè)計(jì)4 原則
為關(guān)聯(lián)字段創(chuàng)建外鍵。
所有的鍵都必須唯一。
避免使用復(fù)合鍵。
外鍵總是關(guān)聯(lián)唯一的鍵字段。
(2) 使用系統(tǒng)生成的主鍵
設(shè)計(jì)數(shù)據(jù)庫的時(shí)候采用系統(tǒng)生成的鍵作為主鍵,那么實(shí)際控制了數(shù)據(jù)庫的索引完整性。這樣,數(shù)據(jù)庫和非人工機(jī)制就有效地控制了對存儲(chǔ)數(shù)據(jù)中
每一行的訪問。采用系統(tǒng)生成鍵作為主鍵還有一個(gè)優(yōu)點(diǎn):當(dāng)擁有一致的鍵結(jié)構(gòu)時(shí),找到邏輯缺陷很容易。
(3) 不要用用戶的鍵(不讓主鍵具有可更新性)
在確定采用什么字段作為表的鍵的時(shí)候,可一定要小心用戶將要編輯的字段。通常的情況下不要選擇用戶可編輯的字段作為鍵。
(4) 可選鍵有時(shí)可做主鍵
把候選鍵進(jìn)一步用做主鍵,可以擁有建立強(qiáng)大索引的能力。
索引使用原則:
索引是從數(shù)據(jù)庫中獲取數(shù)據(jù)的最高效方式之一。95%的數(shù)據(jù)庫性能問題都可以采用索引技術(shù)得到解決。
請按照下列標(biāo)準(zhǔn)選擇建立索引的列。
該列用于頻繁搜索; 該列用于對數(shù)據(jù)進(jìn)行排序。
請不要使用下面的列創(chuàng)建索引:
列中僅包含幾個(gè)不同的值;不要為小型數(shù)據(jù)表設(shè)置任何鍵,假如它們經(jīng)常有插入和刪除操作就更別這樣作了。對這些插入和刪除操作的索引維護(hù)
可能比掃描表空間消耗更多的時(shí)間。
索引查詢是數(shù)據(jù)庫中重要的記錄查詢方法,要不要進(jìn)入索引以及在那些字段上建立索引都要和實(shí)際數(shù)據(jù)庫系統(tǒng)的查詢要求結(jié)合來
考慮,下面給出實(shí)際中的一些通用的原則:
1. 在經(jīng)常用作過濾器的字段上建立索引;
2. 在SQL語句中經(jīng)常進(jìn)行GROUP BY、ORDER BY的字段上建立索引;
3. 在不同值較少的字段上不必要建立索引,如性別字段;
4. 對于經(jīng)常存取的列避免建立索引;
5. 用于聯(lián)接的列(主健/外健)上建立索引;
6. 如果非要在經(jīng)常存取的多個(gè)列上建立復(fù)合索引,但要注意復(fù)合索引的建立順序要按照使用的頻度來確定;
7. 缺省情況下建立的是非簇集索引,但在以下情況下最好考慮簇集索引,如:含有有限數(shù)目(不是很少)唯一的列;進(jìn)行大范圍的查詢;充分的
利用索引可以減少表掃描I/0的次數(shù),有效的避免對整表的搜索。當(dāng)然合理的索引要建立在對各種查詢的分析和預(yù)測中,也取決于DBA的所設(shè)計(jì)的
數(shù)據(jù)庫結(jié)構(gòu)。
本文版權(quán)歸傳智播客Java培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:傳智播客Java培訓(xùn)學(xué)院
首發(fā):http://xamj520.com/javaee
北京校區(qū)