1. 程式人生 > >Mysql 正規化、索引、檢視、事務、sp等概念簡介

Mysql 正規化、索引、檢視、事務、sp等概念簡介

正規化

第一正規化(1NF)無重複的列

        所謂第一正規化(1NF)是指資料庫表的每一列都是不可分割的基本資料項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性。

第二正規化(2NF)屬性完全依賴於主鍵

        第二正規化(2NF)要求實體的屬性完全依賴於主關鍵字。所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性,如果存在,那麼這個屬性和主關鍵字的這一部分應該分離出來形成一個新的實體,新實體與原實體之間是一對多的關係。為實現區分通常需要為表加上一個列,以儲存各個例項的惟一標識。簡而言之,第二正規化就是屬性完全依賴於主鍵。

例項:

選課關係 SCI(SNO,CNO,GRADE,CREDIT),其中SNO為學號, CNO為課程號,GRADEGE 為成績,CREDIT 為學分。 關鍵字為組合關鍵字(SNO,CNO)

在應用中使用以上關係模式有以下問題:
a.資料冗餘,假設同一門課由40個學生選修,學分就 重複40次。
b.更新異常,若調整了某課程的學分,相應的元組CREDIT值都要更新,有可能會出現同一門課學分不同。
c.插入異常,如計劃開新課,由於沒人選修,沒有學號關鍵字,只能等有人選修才能把課程和學分存入。
d.刪除異常,若學生已經結業,從當前資料庫刪除選修記錄。某些門課程新生尚未選修,則此門課程及學分記錄無法儲存。
原因:

非關鍵字屬性CREDIT僅函式依賴於CNO,也就是CREDIT部分依賴組合關鍵字(SNO,CNO)而不是完全依賴。
解決方法:

分成兩個關係模式 SC1(SNO,CNO,GRADE),C2(CNO,CREDIT)。新關係包括兩個關係模式,它們之間通過SC1中的外關鍵字CNO相聯絡,需要時再進行自然聯接,恢復了原來的關係

第三正規化(3NF)屬性不依賴於其它非主屬性

例項:

學生表Student(學號,姓名, 年齡,性別,系別,系辦地址、系辦電話),關鍵字為單一關鍵字"學號"

因為存在如下決定關係:
(學號)→ (姓名, 年齡,性別,系別,系辦地址、系辦電話)
但是還存在下面的決定關係
(學號) → (所在學院)→(學院地點, 學院電話)
即存在非關鍵欄位"學院地點"、"學院電話"對關鍵欄位"學號"的傳遞函式依賴,這樣會存在資料冗餘, 根據第三正規化把學生關係表分為如下兩個表就可以滿足第三正規化了:

學生:(學號, 姓名, 年齡, 性別,系別);
系別:(系別, 系辦地址、系辦電話)。

索引

        索引是一種特殊的檔案,包含了對資料表中所有記錄的引用指標,如果想知道對某個特定話題的討論都在書中的哪些地方出現過,索引可以讓讀者無需把書從頭到尾翻一遍就能把他們查出來。當然,索引也是有缺陷的,因為每修改一個數據索引就要重新整理一次,(有些sql命令裡面有一個delay_key_write,可以暫停插入資料時對索引的重新整理),插入效率會受影響;另外一個索引會在硬碟上佔據相當大的空間。

普通索引:唯一任務就是加快對資料的訪問

唯一索引:普通索引是允許資料重複的,如果確定了某列資料不會重複,則可以建立唯一索引,這樣有兩個好處,索引更有效率;插入新資料的時候如果重複了,mysql會拒絕插入新紀錄

主索引:這個就是為主鍵建立的索引,應該是預設都要建立的

全文索引:文字欄位上的普通索引只能加快對出現在欄位內最前面的字串進行的檢索操作,如果欄位裡存放的是由幾個或者多個單詞構成的大段文字,普通索引就不行了,這種場合用全文索引比較合適

        只有當資料庫裡已經有足夠多的資料時,測試索引才有實際參考價值,因為不管有沒有索引,資料庫在執行第一條查詢命令之後就被載入到記憶體中了,後面查起來都非常快,因此只有當資料庫裡記錄超過1000條、資料總量也超過記憶體的總量時,測試結果才有意義。

檢視

        檢視使得人們可以為一個或者多個數據表定義一個特殊的表現形式。檢視在表現行為上與表沒有差別,可以select查詢,也可以用insert,update,delete來修改資料。

        一般使用檢視的理由有兩個,一個是安全,例如一個表中包含了員工的個人資料,那像電話姓名這些是所有人都可以查詢的,但是像薪水這些東西就只有特定的人能查詢了,因此最好的辦法就是將所有人都可以訪問的資料部分建立為一個檢視,供別人查詢。另一個是方便,檢視使用起來很方便,不用輸入複製的命令

      在視圖裡修改資料:能不能修改某個檢視中的資料取決於檢視的select命令,可重新整理的檢視需要滿足以下幾個條件:

(1)當初定義的select中不得包含group by、distinct、limit、union或having等子命令

(2)如果檢視中的資料來自一個以上的表,那它總是不可重新整理的

(3)檢視中應包含主鍵索引,唯一索引,外間約束條件所涉及到的所有資料列

事務

        為什麼要使用事務操作? 有助於提高資料庫系統的執行效率和安全性,舉個例子,要從一個人的賬戶裝100美元到另一個的賬戶中,需要兩步操作,更新第一個人的賬戶餘額,更新第二個人的賬戶餘額,如果第一個操作執行完以後系統出了問題,那後果就嚴重了。如果有事務的話,如果成功了,那就最好,如果在執行到一半的時候失敗了,那執行了的部分也會被撤銷。事務也可以保證同一批資料不會被兩位使用者同時修改,併發控制。

ACID原則:

原子性:這意味事務就想原子那樣是不可分割的

穩定性:這意味著事務執行完畢後資料庫必須處於一個穩定的狀態

隔離性:多個事務可以獨立執行,不受彼此干擾,如果有一個事務提交了,所有受到影響的事務將自動撤銷並返回錯誤資訊,這樣便於使用者進行操作處理

可靠性:事務一定能夠經受住軟、硬體或者其他意外故障,故障消除後能夠繼續執行

       強調一下:只有InnoDB資料表支援資料,MyISAM資料表不支援事務

事務與鎖定:

共享鎖:select ...lock in share mode  ,這確保了事務過程中讀取的資料記錄不會被其他使用者正在修改和刪除操作

排它鎖:select .... for update ,排它鎖不禁止其他客戶使用普通的select來讀取鎖定的資料記錄,但是會禁止其他共享鎖和排它鎖

儲存過程(stored procedure)

        由mysql伺服器直接儲存和執行的定製過程或者函式。幾個特點:更快的速度、避免程式碼冗餘、提高資料庫的安全性

觸發器

       在insert、update、delete命令之前或者之後對sql命令或者sp的自動呼叫。mysql對觸發器有許多限制,比如:

(1)觸發器程式碼裡無法訪問任何資料表,連觸發器為之定義的那個資料表也不能訪問,類似sp函式的情況,select、insert、update等命令不允許在觸發器程式碼裡出現

(2)觸發器不能用call命令呼叫一個sp

(3)觸發器中不能呼叫事務命令

Mysql伺服器優化記憶體管理:

       調整/etc/my.cnf or  my.ini檔案中的一些引數:

key_buffer_size(預設8MB) 索引緩衝區長度,這個越大,對資料表裡有索引的資料列訪問速度就會越快

table_cache(預設64B)可以同時開啟資料表的個數

sort_buffer(預設為2MB),排序緩衝區長度,如果沒有索引,帶order by或者group bye字句的select命令將使用這個緩衝區對資料進行排序,如果這個太小,就需要用到一個臨時檔案,這可就慢多了。

        另外還有幾個,這裡就不具體再說明了。