數據庫索引:唯一索引【便捷的無重複插入記錄的方法(基於mysql)和索引設計思想小結】

最近的項目中負責server端的東西,涉及到許多數據庫方面的內容。

這裏就記錄下如何對在向數據庫插入記錄的時候儘量快捷的完成無重複插入。

數據庫索引的思想

數據庫中的索引最形象的比喻就是相當於書本的目錄,大概我們要查找一本書中的某個內容,如果沒有目錄,只要不覺得蛋疼,夠淡定,一頁一頁往後翻總是可以找到想要的內容。可是這種順序查找的效率太低了。書都是有目錄的,比如面前是一本操作系統的書,我們想找關於頁的換入換出內容,我們只要先在目錄中找到存儲設備管理的一章,然後直接跳到對應的頁開始搜索,效率和前一種相比自然優秀很多。

數據庫搜索數據也和人類看書一樣,如果數據庫中的數據是按照一定次序存放,並且有種類似目錄的東西可以幫助數據庫快速定位目標數據的位置,數據庫的工作效率也會大大提升。而這種類似目錄的東西就是——數據庫索引。數據庫索引的實現是基於一種樹形結構(B-樹)。當數據庫面對一個有個10000條記錄的表A,並且表A的數據雜亂無章的排列時,我們可以從表A中選取一個列並且做成索引,這時數據庫會對10000條數據進行整理,並把他們組織成二叉樹的結構(數據再多,只要有了一定的次序和結構,對數據的訪問就可以靈活多了)。在這個時候,當我們要數據庫從A表中給我們抽出某個數據的時候,數據庫就不會傻傻的從第一個開始搜索,而是按照樹形結構從樹根一層一層的搜索(其實就是一次一次的縮小搜索範圍的過程)。這樣,樹有幾層,訪問幾次就能找到數據。

 索引的具體使用:

數據庫索引下面直接說說我要做的功能:去除重複記錄的把10000條數據存入一個數據庫表中。

一種最直觀的想法是每次要插入一個記錄R的時候,先做一個select操作,搜一下當前表中有沒有這條記錄R,如果搜索的結果是空,就用insert操作存入R。可是每次都這樣搜索(假設目前表中沒有建立索引),數據庫只能從第一個開始(像翻沒有目錄的書一樣)一條一條的搜索,然後返回結果,數據量越多,這種操作就越低效。

所以雖然上面的方法可行,但是效率和下面一種方法相差很多倍。

假如A表只有一列C(如果是多列的話可以建立聯合唯一索引,思想上是沒有太大差別的)。我們可以用命令:

ALTER TABLE A ADD UNIQUE (C);

數據庫依照C這一列的數據內容建立一個唯一索引(UNIQUE意思就是建立唯一索引,還有很多其他類型的索引),如果是在建立表的時候就直接指定C是唯一索引可以這樣:

CREATE TABLE A(id int(10) not null primary key auto_increment,C varchar(20),UNIQUE (C));

這裏就建立了一個表,表中第一列是id,他是自動遞增的主鍵,第二列是長度20的字符串列C,並且C被設置成唯一索引。

然後我們利用下面命令往裏插入數據:

INSERT IGNORE INTO A(C) VALUES(XXX);

這裏和最一般的INSERT命令相比多了一個關鍵字是IGNORE,意思是如果當前C和表中某行的C列重複了就不做任何處理。

這樣無重複插入數據就完成了。

優勢:在插入數據的時候,數據庫會搜索要插入的數據在數據庫當前表中是否存在。而搜索的方式是按照二叉樹進行搜索。而不是簡單的順序搜索,所以這樣的處理在數據量較大的時候可以明顯感覺到效率很高,


技術相關更多文章猛擊:哇啦天堂論壇技術區

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章