【數據庫】數據庫 重點知識複習總結

✨數據庫的三大範式?

  • 第一範式:每個列都不可以再拆分。
  • 第二範式:在第一範式的基礎上,非主鍵列完全依賴於主鍵,而不能是依賴於主鍵的一部分。
  • 第三範式:在第二範式的基礎上,非主鍵列只依賴於主鍵,不依賴於其他非主鍵。

✨事務的特性?

事務有四大特性,分別是ACID

  • 原子性(Atomicity): 一個事務被視爲最小的不可分割的一部分,事務的所有操作要麼全部提交成功,要麼全部失敗回滾。
  • 一致性(Consistency)
    數據庫在事務執行前後都保持一致性狀態。在一致性狀態下,所有事務對同一個數據的讀取結果都是相同的。
  • 可見性(Isolation)
    一個事務所做的修改在最終提交以前,對其它事務是不可見的。
  • 持久性(Durability)
    一旦事務提交,則其所做的修改將會永遠保存到數據庫中。即使系統發生崩潰,事務執行的結果也不能丟失

✨併發環境下事務可能出現什麼問題?

併發環境下,由於事務的隔離性很難保證,所以會出現一系列的併發問題。

  • 髒讀:讀髒數據指在不同的事務下,當前事務可以讀到另外事務未提交的數據。
  • 幻讀:幻讀是指一個事務統計了總數,另一個事務插入或刪除一個數據,當地一個事務再次統計時,發現兩次讀取的總數不一致
  • 不可重複讀:不可重複讀指在一個事務內多次讀取同一數據集合。在這一事務還未結束前,另一事務也訪問了該同一數據集合並做了修改,由於第二個事務的修改,第一次事務的兩次讀取的數據可能不一致

✨事務隔離級別有什麼?

爲了保證併發操作的安全,所以引入了事務的不同隔離級別:

  • 讀未提交(read uncommitted):一個事務還沒有提交,他做的更改就可以被其它事務看到。
  • 讀提交(read committed):一個事務提交以後,他做的更改纔可以被其它事務看到。
  • 可重複讀(repeatable read):一個事務再執行過程中看到的數據,總和這個事務在啓動時看到的數據一致。
  • 串行化(serializable):對於同一行記錄,讀會加“讀鎖”,寫會加“寫鎖”當發生衝突時,後一個事務必須等前一個事務完執行成後才能繼續執行。

隔離的級別越高,相對就越安全,效率也就越低。在MySQL中的默認隔離級別是:可重複讀, 而在SQL Sever 和Oracle 中默認隔離級別是:讀提交

✨MySQL是怎麼實現可重複讀的隔離級別?

MySQL的InnoDB引擎使用多版本併發控制(Multi-Version Concurrency Control, MVCC)來實現可重複讀這種隔離級別。它是在每個事務開始前增加一個版本快照,在這個事務執行期間,讀數據都是讀到的事務開始時的快照的值,如果進行寫操作可以讀到最新值後進行寫。MVCC 規定了只能讀取已經提交的快照
而MVCC在實現時,時使用Undo log ,每一個數據的修改都會在Undo log中有記錄,通過回滾指針,可以訪問到不同版本下的數據的值。在訪問數據時,會比較事務開始時的版本號和該數據的版本號,來決定是否可以讀到該數據。

✨MySQL的索引使用什麼數據結構?爲什麼?

MySQL的InnoDB引擎使用B+樹來存儲數據,在每一個節點中進行二分查詢,查到節點後繼續按照樹的索引找到下一個節點。B+樹相對於紅黑樹、平衡樹都有更好的磁盤訪問效率,它的優點有:

  1. 樹高度更低,由於具體數據都是存放在葉子節點中,所以非葉子節點就可以多存放更多的節點,這樣也提升了磁盤訪問的效率。
  2. 更好的區間查詢,由於B+樹的葉子節點會通過鏈式形式進行連接,相比於平衡樹需要跨節點訪問而言,B+樹只需要在葉子節點通過鏈表的形式就可以查詢到
  3. 查詢性能更加穩定,對於B+樹,每次都要查詢到葉子節點,因此查詢效率是穩定的

✨使用索引有什麼好處?

  • 使用索引可以大大的減少服務器要掃描數據的行數
  • 將隨機IO轉爲順序IO(B+樹是有序的,將相鄰的數據存儲在一起)
  • 幫助服務器進行排序和分組的操作,避免產生臨時表(B+索引是有序的,可以用於 ORDER BY 和 GROUP BY 操作)

✨爲什麼一條SQL語句執行比較慢?

導致SQL語句執行較慢有很多原因,這裏列出其中幾種:

  • 字段上沒有索引
  • 有索引但是沒有使用到(對字段進行了函數操作等)
  • 沒有獲取到鎖
  • Undo log 過多

具體參見 一條SQL語句爲什麼執行這麼慢?

✨主鍵索引和普通索引的區別?

主鍵索引在一個表中只能有一個,也稱爲聚簇索引,它的葉子節點存放的數據是整行的數據
普通索引在一個表中可以有多個,也成爲二級索引,它的葉子節點存放的是主鍵索引的值
對於在主鍵索引上查找數據,找到葉子節點就找到了具體的數據,對於普通索引找到葉子節點後還要進行回表,到主鍵索引上查找需要的數據

✨什麼是前綴索引?

前綴索引就是對於一個聯合索引來說,在進行查詢操作時會以最左前綴的規則來進行匹配。如果匹配到,就可以使用這個索引。
比如有一個(a,b)的索引,有一個語句是對a字段進行查詢,就可以匹配到(a,b)索引,而要想對b索引進行查詢就不可以匹配到。

✨什麼是覆蓋索引?

如果一個普通索引的葉子節點已經包含了需要查找的值
使用覆蓋索引有以下好處:

  • 索引通常遠小於數據行的大小,只讀取索引能大大減少數據訪問量。
  • 一些存儲引擎(例如 MyISAM)在內存中只緩存索引,而數據依賴於操作系統來緩存。因此,只訪問索引可以不使用系統調用(通常比較費時)。
  • 對於 InnoDB 引擎,若輔助索引能夠覆蓋查詢,則無需回表

以上知識具體參見:關於MySQL索引的基礎知識

✨瞭解InnoDB存儲引擎?

  • 它是 MySQL 默認的事務型存儲引擎,只有在需要它不支持的特性時,才考慮使用其它存儲引擎。
  • 實現了四個標準的隔離級別,默認級別是可重複讀(REPEATABLE READ)。在可重複讀隔離級別下,通過多版本併發控制(MVCC)+ Next-Key Locking 防止幻影讀。
  • 主索引是聚簇索引,在索引中保存了數據,從而避免直接讀取磁盤,因此對查詢性能有很大的提升。
  • 內部做了很多優化,包括從磁盤讀取數據時採用的可預測性讀、能夠加快讀操作並且自動創建的自適應哈希索引、能夠加速插入操作的插入緩衝區等。
  • 支持真正的在線熱備份。其它存儲引擎不支持在線熱備份,要獲取一致性視圖需要停止對所有表的寫入,而在讀寫混合場景中,停止寫入可能也意味着停止讀取。

✨瞭解MyISAM存儲引擎?

  • 設計簡單,數據以緊密格式存儲。對於只讀數據,或者表比較小、可以容忍修復操作,則依然可以使用它。
  • 提供了大量的特性,包括壓縮表、空間數據索引等。
  • 不支持事務。
  • 不支持行級鎖,只能對整張表加鎖,讀取時會對需要讀到的所有表加共享鎖,寫入時則對錶加排它鎖。但在表有讀取操作的同時,也可以往表中插入新的記錄,這被稱爲併發插入(CONCURRENT INSERT)。
  • 可以手工或者自動執行檢查和修復操作,但是和事務恢復以及崩潰恢復不同,可能導致一些數據丟失,而且修復操作是非常慢的。
  • 如果指定了 DELAY_KEY_WRITE 選項,在每次修改執行完成時,不會立即將修改的索引數據寫入磁盤,而是會寫到內存中的鍵緩衝區,只有在清理鍵緩衝區或者關閉表的時候纔會將對應的索引塊寫入磁盤。這種方式可以極大的提升寫入性能,但是在數據庫或者主機崩潰時會造成索引損壞,需要執行修復操作。

✨InnoDB和MyISAM的區別?

  • 事務:InnoDB 支持事務,MyISM不支持事務
  • 併發:MyISAM 只支持表級鎖,而 InnoDB 支持行鎖
  • 外鍵:InnoDB 支持外鍵。
  • 備份:InnoDB 支持在線熱備份。
  • 崩潰恢復:MyISAM 崩潰後發生損壞的概率比 InnoDB 高很多,而且恢復的速度也更慢。
  • 其它特性:MyISAM 支持壓縮表和空間數據索引。

✨說一下數據庫字段的數據類型

在這裏插入圖片描述

✨說說主從庫複製

主要涉及三個線程:binlog 線程、I/O 線程和 SQL 線程。

  • binlog 線程 :負責將主服務器上的數據更改寫入二進制日誌(Binary log)中。
  • I/O 線程 :負責從主服務器上讀取二進制日誌,並寫入從服務器的中繼日誌(Relay log)。
  • SQL 線程 :負責讀取中繼日誌,解析出主服務器已經執行的數據更改並在從服務器中重放(Replay)。
    主服務器處理寫操作以及實時性要求比較高的讀操作,而從服務器處理讀操作。

✨讀寫分離能提高性能的原因在於?

  • 主從服務器負責各自的讀和寫,極大程度緩解了鎖的爭用;
  • 從服務器可以使用 MyISAM,提升查詢性能以及節約系統開銷;
  • 增加冗餘,提高可用性。
  • 讀寫分離常用代理方式來實現,代理服務器接收應用層傳來的讀寫請求,然後決定轉發到哪個服務器。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章