1. 程式人生 > >資料庫常見面試題(附答案)

資料庫常見面試題(附答案)

1.事務四大特性 
原子性,要麼執行,要麼不執行 
隔離性,所有操作全部執行完以前,其它會話不能看到過程 
一致性,事務前後,資料總額一致 
永續性,一旦事務提交,對資料的改變就是永久的

2.資料庫隔離級別,每個級別會引發什麼問題,mysql預設是哪個級別

髒讀:事務B讀取事務A還沒有提交的資料 
不可重複讀:兩次事務讀的資料不一致 
幻讀:事務A修改了資料,事務B也修改了資料,這時在事務A看來,明明修改了資料,昨不一樣, 
隔離級別 讀資料一致性 髒讀 不可重複讀 幻讀 
未提交讀 最低級別 是 是 是 
已提交讀 語句級 否 是 是 
事務級 事務級 否 否 是 
序列化 最高級別 否 否 否

3.MYSQL的兩種儲存引擎區別(事務、鎖級別等等),各自的適用場景 
MYISAM 不支援事務,不支援外來鍵,表鎖,插入資料時,鎖定整個表,查表總行數時,不需要全表掃描 
INNODB 支援事務,支援外來鍵,行鎖,查表總行數時,全表掃描

4.索引有B+索引和hash索引,各自的區別 
hash索引,等值查詢效率高, 
不能排序 
不能進行範圍查詢

B+索引 
資料有序 
範圍查詢

5.B+索引資料結構,和B樹的區別

1.單一節點儲存更多的元素,B+樹空間利用率更高,使得查詢的IO次數更少。 
2.所有查詢都要查詢到葉子節點,查詢效能穩定。 
3.所有葉子節點形成有序連結串列,便於範圍查詢

6.索引的底層實現(B+樹,為何不採用紅黑樹,B樹) 
增加,刪除,紅黑樹會進行頻繁的調整,來保證紅黑樹的性質,浪費時間 
B樹,查詢效能不穩定,查詢結果高度不致, 
B樹,每個結點儲存指向真實資料的指印,相比B+樹每一層每屋儲存的元素更多,顯得更高一點。

7.聚集索引和非聚集索引區別 
聚集索引,資料按索引順序儲存,中子結點儲存真實的物理資料 
非聚集索引,儲存指向真正資料行的指標

8.索引的優缺點,什麼時候使用索引,什麼時候不能使用索引(重點) 
索引最大的好處是提高查詢速度, 
缺點是更新資料時效率低,因為要同時更新索引 
對資料進行頻繁查詢進建立索引,如果要頻繁更改資料不建議使用索引。

9.B樹,也是B-樹 
先看二叉查詢樹,時間複雜度log(n),考慮磁碟IO,所以需要二叉查詢樹矮寬,減小樹的高度。 
1.根結點至少有兩個子女。 
2.每個中間節點都包含k-1個元素和k個孩子,其中 m/2 <= k <= m 
3.每一個葉子節點都包含k-1個元素,其中 m/2 <= k <= m 
4.所有的葉子結點都位於同一層。 
5.每個節點中的元素從小到大排列,節點當中k-1個元素正好是k個孩子包含的元素的值域分劃 
k的大小取決於磁碟頁的大小,主存和磁碟以頁為單位交換資料。當程式要讀取的資料不在主存中時,會觸發一個缺頁異常, 
此時系統會向磁碟發出讀盤訊號,磁碟會找到資料的起始位置並向後連續讀取一頁或幾頁載入記憶體中,然後異常返回,程式繼續執行。

10.InnoDB索引和MyISAM索引的區別: 
一是主索引的區別,InnoDB的資料檔案本身就是索引檔案。而MyISAM的索引和資料是分開的。 
二是輔助索引的區別:InnoDB的輔助索引data域儲存相應記錄主鍵的值而不是地址。而MyISAM的輔助索引和主索引沒有多大區別。

11.為什麼使用B-/+Tree 
索引查詢過程中就要產生磁碟I/O消耗,主要看IO次數,和磁碟存取原理有關。 
根據B-Tree的定義,可知檢索一次最多需要訪問h個節點。資料庫系統的設計者巧妙利用了磁碟預讀原理, 
將一個節點的大小設為等於一個頁,這樣每個節點只需要一次I/O就可以完全載入 
區域性性原理與磁碟預讀

12.B+樹具體實現 
一個m階的B+樹具有如下幾個特徵: 
1.有k個子樹的中間節點包含有k個元素(B樹中是k-1個元素),每個元素不儲存資料,只用來索引,所有資料都儲存在葉子節點。 
2.所有的葉子結點中包含了全部元素的資訊,及指向含這些元素記錄的指標,且葉子結點本身依關鍵字的大小自小而大順序連結。 
3.所有的中間節點元素都同時存在於子節點,在子節點元素中是最大(或最小)元素

13.資料庫的優化(一條sql中能使用一個索引,多個索引會自動選擇最優的索引,從sql語句優化和索引兩個部分回答) 
原則1.sql儘量使用索引 
2.對sql語句優化 
子查詢變成left join 
limit 分佈優化,先利用ID定位,再分頁 
or條件優化,多個or條件可以用union all對結果進行合併(union all結果可能重複) 
不必要的排序 
where代替having,having 檢索完所有記錄,才進行過濾 
避免巢狀查詢 
對多個欄位進行等值查詢時,聯合索引

14.是否使用索引explain檢視查詢計劃

15.索引最左字首問題 
如果對三個欄位建立聯合索引,如果第二個欄位沒有使用索引,第三個欄位也使用不到索引了。 
16.索引分類,索引失效條件 
普通索引:最基本的索引,沒有任何限制 
唯一索引:與”普通索引”類似,不同的就是:索引列的值必須唯一,但允許有空值。 
主鍵索引:它是一種特殊的唯一索引,不允許有空值。 
全文索引:針對較大的資料,生成全文索引很耗時好空間。 
組合索引:為了更多的提高mysql效率可建立組合索引,遵循”最左字首“原則 
失效條件 
條件是or,如果還想讓or條件生效,給or每個欄位加個索引 
like查詢,以%開發 
內部函式 
對索引列進行計算 
is null不會用,is not null 會用

16.資料庫的主從複製 
預設非同步複製,容易造成主庫資料和從庫不一致 
一個數據庫為Master,一個數據庫為slave,通過Binlog日誌 
slave兩個執行緒,一個執行緒去讀master binlog日誌,寫到自己的中繼日誌 
一個執行緒解析日誌,執行sql 
master啟動一個執行緒 
給slave傳遞binlog日誌

半同步複製 
只有把master傳送的binlog日誌寫到slave的中繼日誌,這時主庫 
才返回操作完成的反饋,效能有一定降低

並行複製 
slave 多個執行緒去請求binlog日誌

17.long_query怎麼解決 
設定引數,開啟慢日誌功能,得到耗時超過一定時間的sql

18.varchar和char的使用場景 
用來儲存字元 
varchar適用字元長度經常變的 
char適用字元長度固定的

19.資料庫連線池的作用 
維護一定數量的連線,減少建立連線的時間 
更快的響應時間 
統一的管理

20.分庫分表,主從複製,讀寫分離 
讀寫分離,讀從庫,寫主庫 
spring配置兩個資料庫,通過AOP(面向切面程式設計),在寫或讀方法前面進行判斷得到動態切換資料來源。

21.資料庫三正規化 
1NF 屬性不可分 
2NF 非主鍵屬性,完全依賴於主鍵屬性 
3NF 非主鍵屬性無傳遞依賴

22.關係型資料庫和非關係型資料庫區別 
資料庫 
型別 特性 
關係型資料庫mysql 1、關係型資料庫,是指採用了關係模型來組織資料的資料庫, 
2.關係型資料庫的最大特點就是事務的一致性;

                    優點
                  1、容易理解:二維表結構是非常貼近邏輯世界一個概念,關係模型相對網狀、層次等其他模型來說更容易理解;
                  2、使用方便:通用的SQL語言使得操作關係型資料庫非常方便;
                  3、易於維護:豐富的完整性(實體完整性、參照完整性和使用者定義的完整性)大大減低了資料冗餘和資料不一致的概率;
                  4、支援SQL,可用於複雜的查詢。 
                     缺點
                  1、為了維護一致性所付出的巨大代價就是其讀寫效能比較差;
                  2、固定的表結構;
                  3、不支援高併發讀寫需求;
                  4、不支援海量資料的高效率讀寫;
1
2
3
4
5
6
7
8
9
10
非關係型資料庫 特性 
HBase 1、使用鍵值對儲存資料; 
2、分散式; 
優點 
無需經過sql層的解析,讀寫效能很高 
基於鍵值對,資料沒有耦合性,容易擴充套件 
儲存資料的格式:nosql的儲存格式是key,value形式 
缺點 
不支援事務 
不提供sql支援

23.資料庫中join的inner join, outer join, cross join 
以A,B兩張表為例 
A left join B 
選出A的所有記錄,B表中沒有的以null 代替 
right join 同理

inner join 
A,B的所有記錄都選出,沒有的記錄以null代替

cross join (笛卡爾積) 
A中的每一條記錄和B中的每一條記錄生成一條記錄 
例如A中有4條,B中有4條,cross join 就有16條記錄

24.有哪些鎖,select時怎麼加排它鎖 
樂觀鎖,自己實現,通過版本號 
悲觀鎖:共享鎖,多個事務,只能讀不能寫,加 lock in share mode 
排它鎖,一個事務,只能寫,for update 
行鎖 
表鎖 
25.死鎖怎麼解決 
找到程序號,kill 程序

26 最左匹配原則 
最左匹配原則是針對索引的 
舉例來說:兩個欄位(name,age)建立聯合索引,如果where age=12這樣的話,是沒有利用到索引的,這裡我們可以簡單的理解為先是對name欄位的值排序,然後對age的資料排序,如果直接查age的話,這時就沒有利用到索引了,查詢條件where name=’xxx’ and age=xx 這時的話,就利用到索引了,再來思考下where age=xx and name=’xxx‘ 這個sql會利用索引嗎,按照正常的原則來講是不會利用到的,但是優化器會進行優化,把位置交換下。這個sql也能利用到索引了
 

原文連結