C++面試寶典--數據庫

原文鏈接:https://www.nowcoder.com/tutorial/93/2f895548adc24f0b88ffcb01c7973f23

1. 請你說一說數據庫索引

索引是對數據庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問數據庫表中的特定信息。如果想按特定職員的姓來查找他或她,則與在表中搜索所有的行相比,索引有助於更快地獲取信息。
索引的一個主要目的就是加快檢索表中數據的方法,亦即能協助信息搜索者儘快的找到符合限制條件的記錄ID的輔助數據結構。

2. 請你說一說數據庫事務

數據庫事務(Database Transaction) ,是指作爲單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。 事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向數據的資源。通過將一組相關操作組合爲一個要麼全部成功要麼全部失敗的單元,可以簡化錯誤恢復並使應用程序更加可靠。一個邏輯工作單元要成爲事務,必須滿足所謂的ACID(原子性、一致性、隔離性和持久性)屬性。事務是數據庫運行中的邏輯工作單位,由DBMS中的事務管理子系統負責事務的處理。

(1)原子性(Atomicity)
原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾,因此事務的操作如果成功就必須要完全應用到數據庫,如果操作失敗則不能對數據庫有任何影響。
(2)一致性(Consistency)
一致性是指事務必須使數據庫從一個一致性狀態變換到另一個一致性狀態,也就是說一個事務執行之前和執行之後都必須處於一致性狀態。
拿轉賬來說,假設用戶A和用戶B兩者的錢加起來一共是5000,那麼不管A和B之間如何轉賬,轉幾次賬,事務結束後兩個用戶的錢相加起來應該還得是5000,這就是事務的一致性。
(3)隔離性(Isolation)
隔離性是當多個用戶併發訪問數據庫時,比如操作同一張表時,數據庫爲每一個用戶開啓的事務,不能被其他事務的操作所幹擾,多個併發事務之間要相互隔離。
即要達到這麼一種效果:對於任意兩個併發的事務T1和T2,在事務T1看來,T2要麼在T1開始之前就已經結束,要麼在T1結束之後纔開始,這樣每個事務都感覺不到有其他事務在併發地執行。
多個事務併發訪問時,事務之間是隔離的,一個事務不應該影響其它事務運行效果。這指的是在併發環境中,當不同的事務同時操縱相同的數據時,每個事務都有各自的完整數據空間。由併發事務所做的修改必須與任何其他併發事務所做的修改隔離。
不同的隔離級別:
Read Uncommitted(讀取未提交[添加中文釋義]內容):最低的隔離級別,什麼都不需要做,一個事務可以讀到另一個事務未提交的結果。所有的併發事務問題都會發生。
Read Committed(讀取提交內容):只有在事務提交後,其更新結果纔會被其他事務看見。可以解決髒讀問題。
Repeated Read(可重複讀):在一個事務中,對於同一份數據的讀取結果總是相同的,無論是否有其他事務對這份數據進行操作,以及這個事務是否提交。可以解決髒讀、不可重複讀。
Serialization(可串行化):事務串行化執行,隔離級別最高,犧牲了系統的併發性。可以解決併發事務的所有問題。
(4)持久性(Durability)
持久性是指一個事務一旦被提交了,那麼對數據庫中的數據的改變就是永久性的,即便是在數據庫系統遇到故障的情況下也不會丟失提交事務的操作。
例如我們在使用JDBC操作數據庫時,在提交事務方法後,提示用戶事務操作完成,當我們程序執行完成直到看到提示後,就可以認定事務以及正確提交,即使這時候數據庫出現了問題,也必須要將我們的事務完全執行完成,否則就會造成我們看到提示事務處理完畢,但是數據庫因爲故障而沒有執行事務的重大錯誤。

3. 請你說說索引是什麼,多加索引一定會好嗎

(1)索引
數據庫索引是爲了增加查詢速度而對錶字段附加的一種標識,是對數據庫表中一列或多列的值進行排序的一種結構。
DB在執行一條Sql語句的時候,默認的方式是根據搜索條件進行全表掃描,遇到匹配條件的就加入搜索結果集合。如果我們對某一字段增加索引,查詢時就會先去索引列表中一次定位到特定值的行數,大大減少遍歷匹配的行數,所以能明顯增加查詢的速度。

優點:
(1)通過創建唯一性索引,可以保證數據庫表中每一行數據的唯一性。
(2)可以大大加快數據的檢索速度,這也是創建索引的最主要的原因。
(3)可以加速表和表之間的連接,特別是在實現數據的參考完整性方面特別有意義。
(4)在使用分組和排序子句進行數據檢索時,同樣可以顯著減少查詢中分組和排序的時間。
(5)通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的性能。

缺點:
(1)創建索引和維護索引要耗費時間,這種時間隨着數據量的增加而增加。
(2)索引需要佔物理空間,除了數據表佔數據空間之外,每一個索引還要佔一定的物理空間,如果要建立聚簇索引,那麼需要的空間就會更大。
(3)當對錶中的數據進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了數據的維護速度。

添加索引原則
(1)在查詢中很少使用或者參考的列不應該創建索引。這是因爲,既然這些列很少使用到,因此有索引或者無索引,並不能提高查詢速度。相反,由於增加了索引,反而降低了系統的維護速度和增大了空間需求。
(2)只有很少數據值的列也不應該增加索引。這是因爲,由於這些列的取值很少,例如人事表的性別列,在查詢的結果中,結果集的數據行佔了表中數據行的很大比例,即需要在表中搜索的數據行的比例很大。增加索引,並不能明顯加快檢索速度。
(3)定義爲text、image和bit數據類型的列不應該增加索引。這是因爲,這些列的數據量要麼相當大,要麼取值很少。
(4)當修改性能遠遠大於檢索性能時,不應該創建索引。這是因爲,修改性能和檢索性能是互相矛盾的。當增加索引時,會提高檢索性能,但是會降低修改性能。當減少索引時,會提高修改性能,降低檢索性能。因此,當修改性能遠遠大於檢索性能時,不應該創建索引。

4. 請你說一說mysql的四種隔離狀態

Mysql主要包含四種隔離狀態:

事務隔離級別 髒讀 不可重複讀 幻讀
讀未提交(read-uncommitted)
不可重複讀(read-committed)
可重複讀(repeatable-read)
串行化(serializable)

5. 請你介紹一下mysql的MVCC機制

MVCC是一種多版本併發控制機制,是MySQL的InnoDB存儲引擎實現隔離級別的一種具體方式,用於實現提交讀可重複讀這兩種隔離級別。MVCC是通過保存數據在某個時間點的快照來實現該機制,其在每行記錄後面保存兩個隱藏的列,分別保存這個行的創建版本號和刪除版本號,然後Innodb的MVCC使用到的快照存儲在Undo日誌中,該日誌通過回滾指針把一個數據行所有快照連接起來。

6. 請問SQL優化方法有哪些

通過建立索引對查詢進行優化
對查詢進行優化,應儘量避免全表掃描

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