1. 主鍵
主鍵的作用有哪些?
1) 保證數據的唯一性,避免發生數據重複的情況。 2) 因爲主鍵可以唯一標識某一行記錄,所以能確保執行數據更新、刪除的時候不會出現張冠李戴的錯誤。 3) 主鍵常常與外鍵構成參照完整性約束,防止出現數據不一致。 2.完整性約束 實體完整性是指關係的主關鍵字不能重複也不能取“空值\"。 參照完整性是定義建立關係之間聯繫的主關鍵字與外部關鍵字引用的約束條件。 如果參照關係K中外部關鍵字的取值,要麼與被參照關係R中某元組主關鍵字的值相同,要麼取空值,那麼,在這兩個關係間建立關聯的主關鍵字和外部關鍵字引用,符合參照完整性規則要求。 3.索引 索引是對數據庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問數據庫表中的特定信息。 例如這樣一個查詢:select * from table1 where id=44。如果沒有索引,必須遍歷整個表,直到ID等於44的這一行被找到爲止;有了索引之後(必須是在ID這一列上建立的索引),直接在索引裏面找44(也就是在ID這一列找),就可以得知這一行的位置,也就是找到了這一行。可見,索引是用來定位的。 索引分爲聚簇索引和非聚簇索引兩種,聚簇索引 是按照數據存放的物理位置爲順序的,而非聚簇索引就不一樣了;聚簇索引能提高多行檢索的速度,而非聚簇索引對於單行的檢索很快。 建立索引的目的是加快對錶中記錄的查找或排序。 爲表設置索引要付出代價的:一是增加了數據庫的存儲空間,二是在插入和修改數據時要花費較多的時間(因爲索引也要隨之變動)。 增加索引有如此多的優點,爲什麼不對錶中的每一個列創建一個索引呢?因爲,增加索引也有許多不利的方面。第一,創建索引和維護索引要耗費時間,這種時間隨着數據量的增加而增加。第二,索引需要佔物理空間,除了數據表佔數據空間之外,每一個索引還要佔一定的物理空間,如果要建立聚簇索引,那麼需要的空間就會更大。第三,當對錶中的數據進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了數據的維護速度。 應該在這些列上創建索引:在經常需要搜索的列上,可以加快搜索的速度;在作爲主鍵的列上,強制該列的唯一性和組織表中數據的排列結構;在經常用在連接的列上,這些列主要是一些外鍵,可以加快連接的速度;在經常需要根據範圍進行搜索的列上創建索引,因爲索引已經排序,其指定的範圍是連續的;在經常需要排序的列上創建索引,因爲索引已經排序,這樣查詢可以利用索引的排序,加快排序查詢時間;在經常使用在WHERE子句中的列上面創建索引,加快條件的判斷速度。
類型
根據數據庫的功能,可以在數據庫設計器中創建三種索引:唯一索引、主鍵索引和聚集索引。
提示:儘管唯一索引有助於定位信息,但爲獲得最佳性能結果,建議改用主鍵或唯一約束。
唯一索引 唯一索引是不允許其中任何兩行具有相同索引值的索引
主鍵索引 在數據庫關係圖中爲表定義主鍵將自動創建主鍵索引,主鍵索引是唯一索引的特定類型。該索引要求主鍵中的每個值都唯一。當在查詢中使用主鍵索引時,它還允許對數據的快速訪問。
聚集索引
在聚集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同。一個表只能包含一個聚集索引。如果某索引不是聚集索引,則表中行的物理順序與鍵值的邏輯順序不匹配。與非聚集索引相比,聚集索引通常提供更快的數據訪問速度。
創建索引
最普通的情況,是爲出現在where子句的字段建一個索引。
CREATETABLEmytable(
idserialprimarykey,
category_idintnotnulldefault0,
user_idintnotnulldefault0,
adddateintnotnulldefault0
);
如果在查詢時常用類似以下的語句:
SELECT * FROM mytable WHERE category_id=1;
最直接的應對之道,是爲category_id建立一個簡單的索引:
CREATE INDEX mytable_categoryid ON mytable (category_id);
OK.如果有不止一個選擇條件呢?例如:
SELECT * FROM mytable WHERE category_id=1 AND user_id=2;
第一反應可能是,再給user_id建立一個索引。不好,這不是一個最佳的方法。可以建立多重的索引。
CREATE INDEX mytable_categoryid_userid ON mytable(category_id,user_id);
接着,來個稍微複雜一點的,如果有個ORDERBY字句呢?不管你信不信,大多數的數據庫在使用orderby的時候,都將會從索引中受益。
SELECT * FROM mytable
WHERE category_id=1 AND user_id=2
ORDER BY add date DESC;
很簡單,就象爲where字句中的字段建立一個索引一樣,也爲ORDERBY的字句中的字段建立一個索引:
CREATE INDEX mytable_categoryid_userid_adddate ON mytable (category_id,user_id,adddate);