資料庫基礎重要知識

Jsp發表於2018-09-14

參考文章:資料庫面試問題集錦

一:資料庫正規化

找出關係模式中不合適的資料依賴,解決插入、刪除、更新異常和資料冗餘問題

1、第一正規化 無重複的列

是在關係模型中,對域新增的一個規範要求,所有的域都應該是原子性的,即資料庫表的每一列 都是不可分割的原子資料項,而不能是集合,陣列,記錄等非原子資料項。即實體屬性有多個值 時,必須拆分為不同的屬性。

2、第二正規化 屬性完全依賴於主鍵【消除部分子函式依賴】

a:第二正規化是在第一正規化的基礎上建立的,即滿足第一正規化必須先滿足第一正規化。

b:資料表中的每個例項或行必須可以被唯一區分,即實體的屬性完全依賴於主關鍵字。

3、第三正規化 屬性不依賴於其它非主屬性【消除傳遞依賴】

在第二正規化基礎上,任何非主屬性不依賴於其它非主屬性

4、BCNF 3NF的改進

在第三正規化的基礎上,資料庫表中不存在任何欄位對任一候選關鍵欄位的傳遞函式依賴,即任何非主屬性不能對主鍵子集依賴(在3NF基礎上消除對主碼子集的依賴)

1NF——2NF:消除非主屬性對碼的部分函式依賴

2NF——3NF:消除非主屬性對碼的傳遞函式依賴

3NF——BCNF:消除主屬性對碼的部分和傳遞函式依賴

BCNF——4NF:消除非平凡且非函式依賴的多值依賴

二:事務

a:事務是資料庫系統區別於其它一切系統的重要特性之一

b:事務是一組具有原子性的SQL查詢,或者說是一個獨立的工作單元

符合ACID特性:原子性、一致性、隔離性和永續性

1、原子性

一個事務必須被視為不可分割的最小單元,整個事務中的所有操作要麼全部提交成功,要麼全部失敗回滾,對於一個事務來說,不可能只執行其中的一部分操作。

2、一致性

事務將資料庫從一個一致性狀態切換到另一個一致性狀態。在事務開始之前和事務結束之後資料庫中資料的完整性沒有被破壞。

3、隔離性

隔離性要求一個事務對資料庫中資料的修改,在未提交完成前對其它事務是不可見的。

SQL標準中定義的四種隔離級別:隔離性由低到高,併發性由高到底

a:未提交讀;b:已提交讀;c:可重複讀;d:可序列化

4、永續性

一旦事務提交,則所做的修改就會永遠儲存在資料庫中。此時即使系統崩潰,已經提交的修改資料也不會丟失。

處理大事務

1、避免一次處理太多的資料

2、移出不必要在事務中的SELECT操作

三:MySQL儲存引擎

MyISAM是MySQL的5.5版本之前的預設資料引擎,不支援事務處理;

InnoDB是MySQL的資料庫引擎之一,最大的特點就是支援ACID相容的事務功能

1、儲存結構

MyISAM:每個MyISAM在磁碟上儲存成三個檔案。第一個檔案的名字以表的名字開始,副檔名指出檔案型別。.frm儲存表的定義,資料檔案的副檔名是.MYD, 索引檔案的副檔名是.MYI。

InnoDB:所有的表都儲存在同一個資料檔案中(也可能是多個檔案,或者是獨立的表空間檔案)。InnoDB的大小隻受限於作業系統檔案的大小,一般2GB。

2、儲存空間

MyISAM:可被壓縮,儲存空間小。支援三種不同的儲存格式:靜態表、動態表和壓縮表

InnoDB:資料儲存在表空間,會在主記憶體建立其專用的緩衝池用於高速緩衝資料和索引

3、可移植性、備份及恢復

MyISAM:資料以檔案的形式儲存,在備份和恢復時可單獨針對某個表進行操作,不支援事務、不支援崩潰後的安全恢復。

InnoDB:免費的方案是拷貝資料檔案、備份binlog或者用mysqldump

4、事務支援

MyISAM:強調的是效能,每次查詢具有原子性,執行速度比InnoDB快,不提供事務支援

InnoDB:提供事務支援,外部鍵等高階資料庫功能。具有事務、回滾和崩潰修復能力的事務安全型表

5、AUTO_INCREMENT

MyISAM:可以和其它欄位一起建立聯合索引。引擎的自動增長列必須是索引,如果是組合索引,自動增長可以不是第一列,可以根據前面幾列進行排序後遞增。

InnoDB:InnoDB必須包含只有該欄位的索引。引擎的自動增長列必須是索引,如果是組合索引也必須是組合索引的第一列

6、表鎖差異

MyISAM:只支援表級鎖,使用者在操作MyISAM表時,select,update,delete,insert語句都會給表自動加鎖,如果加鎖以後的表滿足insert併發的情況下,可以在表的尾部插入新的資料

InnoDB:支援事務和行級鎖。行鎖大幅度提高了多使用者併發操作。但是InnoDB的行鎖,只是在WHERE的主鍵是有效的,非主鍵的WHERE都會鎖全表

7、表主鍵

MyISAM:允許沒有任何索引和主鍵的表存在,索引都是儲存行的地址

InnoDB:如果沒有設定主鍵或者非空唯一索引,就會自動生成一個6位元組的主鍵,資料是主索引的一部分,附加索引儲存的是主索引的值

8、外來鍵

MyISAM:不支援

InnoDB:支援

四:資料庫索引

索引是對資料庫表中一個或多個列的值進行排序的資料結構,以協助快速查詢、更新資料表中資料。索引的實現通常使用B_TREE及其變種。索引加速列資料訪問,因為儲存引擎不再去掃描整張表得到需要的資料,從根結點開始,根節點儲存了位元組點的指標,儲存引擎會根據指標快速尋找資料。

1、索引的底層實現原理和優化

二叉搜尋樹和AVL樹在資料量較大時,都會由於樹的深度過大而造成I/O讀寫過於頻繁,導致查詢效率低下,因此對索引而言,多叉樹結構是不二選擇。B-Tree的各種操作能使B樹保持較低的高度,從而保證高效的查詢效率。

a:B-Tree(平衡多路查詢樹)

B_TREE是一種多路查詢樹,是一種動態查詢效率很高的樹形結構。B_TREE的查詢類似二叉排序樹的查詢,所不同的是B-Tree每個結點上是多關鍵碼的有序表,在到達某個結點時,先在有序表中查詢,找到則查詢成功;否則,按照對應的指標資訊指向的子樹中去查詢,當到達葉子節點時,則說明樹中沒有對應的關鍵碼。由於B_TREE的高檢索效率,B-Tree主要應用在檔案系統和資料庫中,對於儲存在硬碟上的大型資料庫檔案,可以極大程度減少訪問硬碟次數,大幅提高資料檢索效率。

b:B+Tree:InnoDB儲存引擎的索引實現

是B_Tree樹的變形樹,一棵m階的B+樹和m階的B_Tree的差異在於以下三點:

  • n棵子樹的節點中含有那個關鍵碼
  • 所有的葉子節點中包含了全部關鍵碼的資訊,及指向含有這些關鍵碼記錄的指標,且葉子節點本身依關鍵碼的大小自小而大的順序連結。
  • 非終端節點可以看成是索引部分,節點中僅含有其子樹根結點中最大(最小)關鍵碼

對於B+Tree,不管查詢成功與否,每次查詢都是走了一條從根到葉子節點的路徑。

c:B+-Tree比B樹更適合實際應用中作業系統的檔案索引和資料庫索引

1、B+Tree的磁碟讀寫代價更低:B+Tree的內部節點並沒有指向關鍵字具體資訊的指標,因此其內部節點相對B樹更小。如果把所有同一內部節點的關鍵字存放在同一盤塊中,那麼盤塊所能容納的關鍵字數量也越多。一次性讀入記憶體中的需要查詢的關鍵字也越多,相對來說IO讀寫次數也就降低了。

2、B+Tree的查詢效率更加穩定:由於內部節點並不是最終指向檔案內容的節點,而是葉子節點中關鍵字的索引,所以任何關鍵字的查詢必須走一條從根結點到葉子結點的路。所有關鍵字查詢的路徑長度相同,導致每一個資料的查詢效率相當。

3、資料庫索引採用B+Tree而不是B樹的原因:B+樹只要遍歷葉子節點就可以實現整顆樹的遍歷,而B樹只能中序遍歷所有節點。

d:檔案索引和資料庫索引為什麼使用B+樹

檔案與資料庫都是需要較大的儲存,也就是說,它們都不可能全部儲存在記憶體中,故需要儲存到磁碟上。而所謂索引,則為了資料的快速定位與查詢,那麼索引的結構組織要儘量減少查詢過程中磁碟I/O的存取次數,因此B+樹相比B樹更為合適。資料庫系統巧妙利用了區域性性原理與磁碟預讀原理,將一個節點的大小設為等於一個頁,這樣每個節點只需要一次I/O就可以完全載入,而紅黑樹這種結構,高度明顯要深的多,並且由於邏輯上很近的節點(父子)物理上可能很遠,無法利用區域性性。最重要的是,B+樹還有一個最大的好處:方便掃庫。B樹必須用中序遍歷的方法按序掃庫,而B+樹直接從葉子結點挨個掃一遍就完了,B+樹支援range-query非常方便,而B樹不支援,這是資料庫選用B+樹的最主要原因。

2、索引的優點

  • 大大加快資料的檢索速度
  • 加速表和表之間的連線
  • 在使用分組和排序子句進行資料檢索時,同樣可以顯著減少查詢中分組和排序的時間
  • 通過建立唯一性索引,可以保證資料庫表中每一行睡的唯一性

3、什麼情況下設定路索引但無法使用

  • 以“%(表示任意0個或多個字元)”開頭的LIKE語句,模糊匹配
  • OR語句前後沒有同時使用索引
  • 資料型別出現隱式轉化(如varchar不加單引號的話可能會自動轉型為int型)
  • 對於多列索引,必須滿足最左匹配原則

4、什麼樣的欄位適合建立索引

  • 經常作查詢選擇的欄位
  • 經常作表連線的欄位
  • 經常出現在order by,group by,distinct後面的欄位

5、建立索引時需要注意的

a:非空欄位:應該指定列為NOT NULL,除非想儲存NULL。在mysql中,含有空值的列很難進行查詢優化,因為它們使得索引、索引的統計資訊以及比較運算更加複雜,應該用0,一個特殊的值或者一個空串代替空值。

b:取值離散大的欄位:變數各個取值之間的差異程度的列放到聯合索引的前面,可以通過count()函式檢視欄位的差異值,返回值越大說明欄位的唯一值越多欄位的離散程度高

c:索引欄位越小越好:資料庫的資料儲存以頁為單一頁儲存的資料越多一次IO操作獲取的資料越大效率越高。

6、索引的分類

  • 普通索引和唯一性索引:索引列值的唯一性
  • 單個索引和符合索引:索引列包含的列數
  • 聚簇索引和非聚簇索引:聚簇索引按照資料的物理儲存進行劃分的。對於一堆記錄來說,使用聚集索引就是對這堆記錄進行堆劃分,即主要描述的是物理上的儲存。正是因為這種劃分方法,導致聚簇索引必須是唯一的。聚集索引可以幫助把很大的範圍,迅速減小範圍。但是查詢該記錄,就要從這個小範圍中Scan了;而非聚集索引是把一個很大的範圍,轉換成一個小的地圖,然後你需要在這個小地圖中找你要尋找的資訊的位置,最後通過這個位置,再去找你所需要的記錄。

7、主鍵、自增主鍵、主鍵索引和唯一索引

主鍵:欄位唯一、不為空值的列

主鍵索引:即主鍵,主鍵是索引的一種,是唯一索引的特殊型別。建立主鍵的時候,資料庫會為主鍵建立一個唯一索引

自增主鍵:欄位型別為數字,自增,並且是主鍵

唯一索引:索引列的值必須唯一,但允許有空值。

8、主鍵和索引有什麼區別

主鍵是一種特殊的唯一性索引,其可以是聚集索引,也可以是非聚集索引。SQLServer中,主鍵的建立必須依賴於索引,預設建立的是聚集索引,但也可以顯式指定為非聚集索引。InnoDB作為MySQL儲存引擎時,預設按照主鍵進行聚集,如果沒有定義主鍵,InnoDB會試著使用唯一的非空索引來代替。如果沒有這種索引,InnoDB就會定義隱藏的主鍵然後在上面進行聚集。所以,對於聚集索引來說,你建立主鍵的時候,自動就建立了主鍵的聚集索引。

五:儲存過程

儲存過程是事先經過編譯並儲存在資料庫中的一段SQL語句的集合。進一步的說,儲存過程是由一些T-SQL語句組成的程式碼塊,這些T-SQL語句程式碼像一個方法一樣實現一些功能(對單表或多表的增刪改查),然後再給這個程式碼塊取一個名字,在用到這個功能的時候呼叫就行。儲存過程的特點:

  • 儲存過程只在建立時進行編譯,以後每次執行儲存過程都不需再重新編譯,而一般SQL語句每執行一次就編譯一次,使用儲存過程可提高資料庫執行效率
  • 當SQL語句有變動時,可以只修改資料庫中的儲存過程而不必修改程式碼
  • 減少網路傳輸,在客戶端呼叫一個儲存過程比執行一串SQL傳輸的資料量要小
  • 通過儲存過程能夠使沒有許可權的使用者在控制之下間接地存取資料庫

系統儲存過程、本地儲存過程、臨時儲存過程、遠端儲存過程、擴充套件儲存過程


相關文章