主鍵
定義:惟一標識一條記錄,不能有重複的,不容許爲空
做用:用來保證數據完整性
個數:主鍵只能有一個sql
外鍵
定義:表的外鍵是另外一表的主鍵, 外鍵能夠有重複的, 能夠是空值
做用:用來和其餘表創建聯繫用的
個數:一個表能夠有多個外鍵數據庫
索引
定義:該字段沒有重複值,但能夠有一個空值
做用:是提升查詢排序的速度
個數:一個表能夠有多個唯一索引
oracle
彙集索引和非彙集索引的區別?工具
彙集索引必定是惟一索引。但惟一索引不必定是彙集索引。 sqlserver
彙集索引,在索引頁裏直接存放數據,而非彙集索引在索引頁裏存放的是索引,這些索引指向專門的數據頁的數據。spa
彙集索引和非彙集索引的根本區別是表記錄的排列順序和與索引的排列順序是否一致,彙集索引表記錄的排列順序與索引的排列順序一致,優勢是查詢速度快,由於一旦具備第一個索引值的紀錄被找到,具備連續索引值的記錄也必定物理的緊跟其後。彙集索引的缺點是對錶進行修改速度較慢,這是爲了保持表中的記錄的物理順序與索引的順序一致,而把記錄插入到數據頁的相應位置,必須在數據頁中進行數據重排,下降了執行速度。指針
建議使用匯集索引的場合爲:
a.此列包含有限數目的不一樣值;
b.查詢的結果返回一個區間的值;
c.查詢的結果返回某值相同的大量結果集。orm
非彙集索引指定了表中記錄的邏輯順序,但記錄的物理順序和索引的順序不一致,彙集索引和非彙集索引都採用了B+樹的結構,但非彙集索引的葉子層並不與實際的數據頁相重疊,而採用葉子層包含一個指向表中的記錄在數據頁中的指針的方式。非彙集索引比彙集索引層次多,添加記錄不會引發數據順序的重組。server
建議使用非彙集索引的場合爲:
a.此列包含了大量數目不一樣的值;
b.查詢的結束返回的是少許的結果集;
c.order by 子句中使用了該列。排序
組合索引(concatenated index):由多個列構成的索引,如create index idx_emp on emp(col1, col2, col3, ……),則咱們稱idx_emp索引爲組合索引。在組合索引中有一個重要的概念:引導
列(leading column),在上面的例子中,col1列爲引導列。當咱們進行查詢時能夠使用「where col1 = ? 」,也能夠使用「where col1 = ? and col2 = ?」,這樣的限制條件都會使用索引,可是
「where col2 = ? 」查詢就不會使用該索引。因此限制條件中包含先導列時,該限制條件纔會使用該組合索引。
(1)不要忘記索引(index)也不要濫用索引(index)索引是提升數據庫效率的簡單又高效的方法。只要是設置了數據庫表(table),就不要忘記設置索引(index)。將索引設置在常常用於排序的字段上,其餘字段就不要設置了。
索引不是越多越好,也不是什麼字段都適合創建索引的。數據重複性太多的字段不要設置索引。好比 tblMEMBER 的 iSex 字段只有 0 1 兩個值,就不要設置索引。
注:根據業務的狀況來創建索引。
(2)排序消耗開銷:很明顯省掉了排序的操做,在頁面上進行分面處理。
有時候,排序和時間是有相關性的,而彙集索引,沒有建在時間上,會致使排序成本的增長,恰當的利用自增ID來作時間排序,也能省掉不少開銷。
若是業務上的排序能夠建在彙集索引上,哪麼這個排序消耗就會大大降低。(通常作不到這點)
a.用聚合索引比用不是聚合索引的主鍵速度快
b.用聚合索引比用通常的主鍵做order by時速度快,特別是在小數據量狀況下
事實上,若是數據量很小的話,用匯集索引做爲排序列要比使用非彙集索引速度快得明顯的多;而數據量若是很大的話,如10萬以上,則兩者的速度差異不明顯。
注意:在用sql時看這句sql的效率高不高能夠用工具來分析,sqlserver用顯示估計的執行計劃來分析,oracle用解釋計劃來分析。