1. 程式人生 > >【MySQL】mysql面試相關問題(正規化,事物,檢視,索引)

【MySQL】mysql面試相關問題(正規化,事物,檢視,索引)

三大正規化:

1、單個欄位不能繼續拆分,(個人理解:列具有原子性)

2、在第一正規化的基礎上,每個表只描述一件事情。可以理解為第二正規化就是要有主鍵,要求其他欄位都依賴於主鍵。

為什麼要有主鍵——沒有主鍵就沒有唯一性,沒有唯一性在集合中就定位不到這行記錄,所以要有主鍵。
其他欄位為什麼要依賴於主鍵——因為不依賴於主鍵,就找不到他們。更重要的是,其他欄位組成的這行記錄和主鍵表示的是同一個東西,而主鍵是唯一的,它們只需要依賴於主鍵,也就成了唯一的。

舉例:
學生資訊組成學生表,姓名可以做主鍵麼?
不能!因為同名的話,就不唯一了,所以需要學號這樣的唯一編碼才行。
那麼其他欄位依賴於主鍵是什麼意思?
就是“張三”同學的年齡和性別等欄位,不能儲存別人的年齡性別,必須是他自己的,因為張三的學號資訊就決定了,這行記錄歸張三所有,不能給無關人員使用。

3、在第二正規化的基礎上,表中不能存在冗餘欄位(欄位與欄位之間不能冗餘)

三正規化就是要消除傳遞依賴,方便理解,可以看做是“消除冗餘”。
消除冗餘應該比較好理解一些,就是各種資訊只在一個地方儲存,不出現在多張表中。
比如說大學分了很多系(中文系、英語系、計算機系……),這個系別管理表資訊有以下欄位組成:
系編號,系主任,系簡介,系架構。
那麼再回到學生資訊表,張三同學的年齡、性別、學號都有了,我能不能把他的系編號,系主任、系簡介也一起存著?
如果你問三正規化,當然不行,因為三正規化不同意。
因為系編號,系主任、系簡介已經存在系別管理表中,你再存入學生資訊表,就是冗餘了。
三正規化中說的傳遞依賴,就出現了。
這個時候學生資訊表中,系主任資訊是不是依賴於系編號了?而這個表的主鍵可是學號啊!
所以按照三正規化,處理這個問題的時候,學生表就只能增加一個系編號欄位。
這樣既能根據系編號找到系別資訊,又避免了冗餘儲存的問題。

三大正規化只是一般設計資料庫的基本理念,可以建立冗餘較小、結構合理的資料庫。如果有特殊情況,當然要特殊對待,資料庫設計最重要的是看需求跟效能,需求>效能>表結構。所以不能一味的去追求正規化建立資料庫。

關於三大正規化通俗理解的參考:https://blog.csdn.net/q957967519/article/details/81910547

事物的四大特性ACID:

1. 原子性(Atomicity)
>一個事務必須被視為一個不可分割的最小工作單元,整個事務中的所有操作要麼全部提交成功,要麼全部失敗回滾,對於一個事務來說,不可能只執行其中的一部分操作,這就是事務的原子性,原子性關注的是狀態

2. 一致性(Consistency)
>資料庫總是從一個一致性的狀態轉換到另一個一致性的狀態。事務執行的前後都是合法的資料狀態,不會違背任何的資料完整性,這就是“一致”的意思。當然這個含義中也隱含著對開發者的要求,就是不能寫出錯誤的事務邏輯,比如銀行的轉賬不能只加錢不減錢,這是應用層面的一致性要求。一致性關注資料的可見性。

3. 隔離性(Isolation)

>通常來說,一個事務所做的修改在最終提交以前,對其他事務是不可見的。如果有兩個事務,執行在相同的時間內,執行相同的功能,事務的隔離性將確保每一事務在系統中認為只有該事務在使用系統。這種屬性有時稱為序列化,為了防止事務操作間的混淆,必須序列化或序列化請求,使得在同一時間僅有一個請求用於同一資料。

4. 永續性(Durability)

>一旦事務提交,則其所做的修改會永久儲存到資料庫。(此時即使系統崩潰,修改的資料也不會丟失。)當事務被提交後就無法再回滾,如果想要撤銷一個已經提交的事務,那就只能執行一個效果與其相反的事務,這也是永續性的一種體現。

注意:

原子性和一致性的的側重點不同:原子性關注狀態,要麼全部成功,要麼全部失敗,不存在部分成功的狀態。而一致性關注資料的可見性,中間狀態的資料對外部不可見,只有最初狀態和最終狀態的資料對外可見 。

檢視:

檢視是一種基於查詢結果產生的虛擬表,檢視是一個虛擬表,實際它就是一條被封裝起來的 SQL 查詢語句。
- 在使用檢視時,就相當執行了被封裝的複雜SQL查詢語句。
- 檢視不儲存具體的資料。
- 檢視的基本表發生變化,那麼檢視也隨之變化 
- 通過檢視可以對使用者展示指定欄位從而遮蔽其他欄位資料,更加安全

索引:

什麼是索引:能夠快速查詢資料的線索就稱之為索引,目的在於提高查詢效率。

索引的使用:

+ 查看錶中已有索引 :`show index from 表名`
+ 建立索引
`create index 索引名稱 on 表名(欄位名稱(長度))`
    - 如果指定欄位是字串,需要指定長度,建議長度與定義欄位時的長度一致
    - 欄位型別如果不是字串,可以不填寫長度部分

+ 刪除索引:
`drop index 索引名稱 on 表名;`

索引的缺點:

第一, 建立索引和維護索引要耗費時間,這種時間隨著資料量的增加而增加。 
第二, 索引需要佔物理空間,除了資料表佔資料空間之外,每一個索引還要佔一定的物理空間,如果要建立聚簇索引,那麼需要的空間就會更大。 
第三, 當對錶中的資料進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了資料的維護速度。
注意:

1. 索引可以明顯提高某些欄位的查詢效率。
2. 但不是所有的表都需要建立索引 
3. 如果表中資料很少,沒有必要建立索引
4. 如果一個表中的資料增刪很頻繁,不能建立索引 ,因為只要資料發生增減,索引就要重新建立。增加了系統開銷,反而慢了
5. 索引只適合查詢操作頻繁的表