數據庫面試題匯總


1),********說一下 ACID 是什么?
******************
原子性(Atomicity)
一個事務必須被視為一個不可分割的最小工作單元,整個事務中的
所有操作要么全部提交成功,要么全部失敗回滾,對於一個事務來
說,不可能只執行其中的一部分操作,這就是事務的原子性
一致性(Consistency)
數據庫總是從一個一致性的狀態轉換到另一個一致性的狀態。(在
前面的例子中,一致性確保了,即使在執行第三、四條語句之間時
系統崩潰,支票賬戶中也不會損失200美元,因為事務最終沒有提交
,所以事務中所做的修改也不會保存到數據庫中。)
隔離性(Isolation)
通常來說,一個事務所做的修改在最終提交以前,對其他事務是不
可見的。(在前面的例子中,當執行完第三條語句、第四條語句還
未開始時,此時有另外的一個賬戶匯總程序開始運行,則其看到支
票帳戶的余額並沒有被減去200美元。)
持久性(Durability)
一旦事務提交,則其所做的修改會永久保存到數據庫。(此時即使
系統崩潰,修改的數據也不會丟失。)

2). *****************說一下樂觀鎖和悲觀鎖?
樂觀鎖:對加鎖持有一種樂觀的態度,即先進行業務操作,不到最
后一步不進行加鎖,"樂觀"的認為加鎖一定會成功的,在最后一步
更新數據的時候在進行加鎖。樂觀鎖的實現方式一般為每一條數據
加一個版本號
update時判斷這個版本號是否和數據庫里的一致,提交數據前后是
否沖突。
update是單線程的,及如果一個線程對一條數據進行update操作,
會獲得鎖,其他線程如果要對同一條數據操作會阻塞,直到這個線
程update成功后釋放鎖。

悲觀鎖:悲觀鎖對數據加鎖持有一種悲觀的態度。因此,在整個數
據處理過程中,將數據處於鎖定狀態。悲觀鎖的實現,往往依靠數
據庫提供的鎖機制
備注,在MySQL中使用悲觀鎖,必須關閉MySQL的自動提交,set
autocommit=0。MySQL默認使用自動提交autocommit模式,也即你執
行一個更新操作,MySQL會自動將結果提交

3),*************************排它鎖 & 共享鎖你了解嗎 ?

首先說明:數據庫的增刪改操作默認都會加排他鎖,而查詢不會加
任何鎖。都是行級鎖
|--共享鎖:對某一資源加共享鎖,自身可以讀該資源,其他人也可
以讀該資源(也可以再繼續加共享鎖,即 共享鎖可多個共存),但
無法修改。要想修改就必須等所有共享鎖都釋放完之后。語法為:
select * from table lock in share mode

|--排他鎖:對某一資源加排他鎖,自身可以進行增刪改查,其他人
無法進行任何操作。語法為:
select * from table for update

4). ********************說一下 mysql 的行鎖和表鎖

行鎖的劣勢:開銷大;加鎖慢;會出現死鎖
行鎖的優勢:鎖的粒度小,發生鎖沖突的概率低;處理並發的能力

表鎖的優勢:開銷小;加鎖快;無死鎖
表鎖的劣勢:鎖粒度大,發生鎖沖突的概率高,並發處理能力低
1 InnoDB 支持表鎖和行鎖,使用索引作為檢索條件修改數據時采用
行鎖,否則采用表鎖。
2 InnoDB 自動給修改操作加鎖,給查詢操作不自動加鎖
3 行鎖可能因為未使用索引而升級為表鎖,所以除了檢查索引是否
創建的同時,也需要通過explain執行計划查詢索引是否被實際使用
4 行鎖相對於表鎖來說,優勢在於高並發場景下表現更突出,畢竟
鎖的粒度小。
5 當表的大部分數據需要被修改,或者是多表復雜關聯查詢時,建
議使用表鎖優於行鎖。
6 為了保證數據的一致完整性,任何一個數據庫都存在鎖定機制。
鎖定機制的優劣直接影響到一個數據庫的並發處理能力和性能
若你不清楚InnoDB的行鎖會升級為表鎖,那以后會吃大虧的

5). 說一下數據庫的事務隔離?

更新丟失----read uncommitted(讀未提交)
臟讀------寫禁止讀,防止臟讀
不可重復讀-----repeatable read 可重復讀取
幻讀(虛讀)-------serializable 序列化

6).******mysql 的內連接、左連接、右連接有什么區別?

1.內連接,顯示兩個表中有聯系的所有數據;
select a.*,b.* from a inner join b on a.id=b.parent_id
2.左鏈接,以左表為參照,顯示所有數據,右表中沒有則以null顯示
select a.*,b.* from a left join b on a.id=b.parent_id
3.右鏈接,以右表為參照顯示數據,,左表中沒有則以null顯示
select a.*,b.* from a right join b on a.id=b.parent_id
補充:完全連接 顯示兩個表中所有的數據
select a.*,b.* from a full join b on a.id=b.parent_id

7),mysql 索引是怎么實現的?

索引是滿足某種特定查找算法的數據結構,而這些數據結構會以某
種方式指向數據,從而實現高效查找數據。
具體來說 MySQL 中的索引,不同的數據引擎實現有所不同,但目前
主流的數據庫引擎的索引都是 B+ 樹實現的,B+ 樹的搜索效率,可
以到達二分法的性能,找到數據區域之后就找到了完整的數據結構
了,所有索引的性能也是更好的。

8). 怎么驗證 mysql 的索引是否滿足需求?

使用 explain 查看 SQL 是如何執行查詢語句的,從而分析你的索
引是否滿足需求。
explain 語法:explain select * from table where type=1。

9). 說一下 mysql 常用的引擎?


InnoDB 引擎:InnoDB 引擎提供了對數據庫 acid 事務的支持,並
且還提供了行級鎖和外鍵的約束,它的設計的目標就是處理大數據
容量的數據庫系統。MySQL 運行的時候,InnoDB 會在內存中建立緩
沖池,用於緩沖數據和索引。但是該引擎是不支持全文搜索,同時
啟動也比較的慢,它是不會保存表的行數的,所以當進行 select
count(*) from table 指令的時候,需要進行掃描全表。由於鎖的
粒度小,寫操作是不會鎖定全表的,所以在並發度較高的場景下使用
會提升效率的。
MyIASM 引擎:MySQL 的默認引擎,但不提供事務的支持,也不支持
行級鎖和外鍵。因此當執行插入和更新語句時,即執行寫操作的時
候需要鎖定這個表,所以會導致效率會降低。不過和 InnoDB 不同
的是,MyIASM 引擎是保存了表的行數,於是當進行 select count
(*) from table 語句時,可以直接的讀取已經保存的值而不需要進
行掃描全表。所以,如果表的讀操作遠遠多於寫操作時,並且不需
要事務的支持的,可以將 MyIASM 作為數據庫引擎的首選。

10). mysql 問題排查都有哪些手段?

使用 show processlist 命令查看當前所有連接信息。
使用 explain 命令查詢 SQL 語句執行計划。
開啟慢查詢日志,查看慢查詢的 SQL。


11). 如何做 mysql 的性能優化?

為搜索字段創建索引。
避免使用 select *,列出需要查詢的字段。
垂直分割分表。
選擇正確的存儲引擎。

12). 如何獲取當前數據庫版本

使用 select version() 獲取當前 MySQL 數據庫版本。


13). 一張自增表里面總共有 7 條數據,刪除了最后 2 條數據,重
啟mysql 數據庫,又插入了一條數據,此時 id 是幾

表類型如果是 InnoDB,那 id 就是 6。
表類型如果是 MyISAM ,那 id 就是 8。

14). 數據庫的三范式是什么?

第一范式:強調的是列的原子性,即數據庫表的每一列都是不可分
割的原子數據項。
第二范式:要求實體的屬性完全依賴於主關鍵字。所謂完全依賴是
指不能存在僅依賴主關鍵字一部分的屬性。
第三范式:任何非主屬性不依賴於其它非主屬性。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM