14 個必須掌握的數據庫面試問題
本文總結了 14 個必須掌握的數據庫面試題,附答案,快看看是否對你有幫助!
1 爲什麼使用數據索引能提高效率
-
數據索引的存儲是 有序的
-
在有序的情況下, 通過索引查詢一個數據是無需遍歷索引記錄的
-
極端情況下,數據索引的查詢效率爲二分法查詢效率, 趨近於 log2(N)
2 B + 樹索引和哈希索引的區別
B + 樹是一個平衡的多叉樹,從根節點到每個葉子節點的高度差值不超過 1, 而且同層級的節點間有指針相互鏈接,是有序的,如下圖:
哈希索引就是採用一定的哈希算法,把鍵值換算成新的哈希值,檢索時不需要類似 B + 樹那樣從根節點到葉子節點逐級查找,只需一次哈希算法即可, 是無序的,如下圖所示:
3 哈希索引的優勢
等值查詢,哈希索引具有絕對優勢 (前提是: 沒有大量重複鍵值,如果大量重複鍵值時,哈希索引的效率很低,因爲存在所謂的哈希碰撞問題。
4 哈希索引不適用的場景
-
不支持 範圍查詢
-
不支持索引完成排序
-
不支持聯合索引的最左前綴匹配規則
5 什麼是表分區?
表分區,是指根據一定規則,將數據庫中的一張表分解成多個更小的,容易管理的部分。從邏輯上看,只有一張表,但是底層卻是由多個物理分區組成
6 表分區與分表的區別?
分表:指的是通過一定規則, 將一張表分解成多 張不同的表。比如將用戶訂單記錄根據時間成多個表。
分表與分區的區別在於: 分區從邏輯上來講只有一張表 , 而分表則是將一張表分解成多張表。
7 表分區有什麼好處?
-
存儲更多數據。分區表的數據可以分佈在不同的物理設備上,從而高效地利用多個硬件設備。和單個磁盤或者文件系統相比,可以存儲更多數據
-
優化 E 詢。在 where 語句中包含分區條件時,可以只掃描一個或多 個分區表來提高查詢效率; 涉及 sum 和 count 語句時,也可以在多個分區上並行處理,最後彙總結果。
-
分區表更容易維護。例如: 想批量刪除大量數據可以清除整個分區。
-
避免某些特殊的瓶頸,例如 InnoDB 的單個索引的互斥訪問, ext3 問價你係統的 inode 鎖競爭等。
8 在 MVCC 併發控制中, 讀操作可以分成兩類
快照讀 (snapshot read): 讀取的是記錄的可見版本 (有可能是歷史版本),不用加鎖 (共享讀鎖 s 鎖也不加,所以不會阻塞其他事務的寫)
當前讀 (currentread): 讀取的是記錄的最新版本,並且,當前讀返回的記錄,都會加上鎖,保證其他事務不會再併發修改這條記錄
9 行級鎖定的優點
-
當在許多線程中訪問不同的行時只存在少量鎖定衝突。
-
回滾時只有少量的更改
-
可以長時間鎖定單一的行。
10 行級鎖定的缺點
比頁級或表級鎖定佔用更多的內存。當在表的大部分中使用時,比頁級或表級鎖定速度慢,因爲你必須獲取更多的鎖。如果你在大部分數據上經常進行 GROUP BY 操作或者必須經常掃描整個表,比其它鎖定明顯慢很多。用高級別鎖定,通過支持不同的類型鎖定, 你也可以很容易地調節應用程序,因爲其鎖成本小於行級鎖定。
11 MySQL 優化
-
開啓查詢緩存,優化查詢
-
explain 你的 select 查詢, 這可以幫你分析你的查詢語句或是表結構的性能瓶頸。EXPLAIN 的查詢結果還會告訴你你的索引 主鍵被如何利用的,你的數據表是如何被搜索和排序的
-
當只要一行數據時使用 limit 1, MySQL 數據庫引擎會在找到一條數據後停止搜索, 而不是繼續往後查少下一條符合記錄的數據
-
爲搜索字段建索引
-
使用 ENUM 而不是 VARCHAR
-
Prepared StatementsPrepared Statements 很像存儲過程, 是一種運行在後臺的 SQL 語句集合, 我們可以從使用
prepared statements 獲得很多好處,無論是性能問題還是安全問題。
Prepared Statements 可以檢查一些你綁定好的變量,這樣可以保護你的程序不會受到 “SQL 注入式” 攻擊
-
垂直分表
-
選擇正確的存儲引擎
12 key 和 index 的區別
key 是數據庫的物理結構,它包含兩層意義和作用,一是約束 (偏 重於約束和規範數據庫的結構完整性) , 二是索引 (輔助查詢 用的)。包括 primary key, unique key, foreign key 等
index 是數據庫的物理結構,它只是輔助查詢的,它創建時會在另外的表空間 (mysql 中的 innodb 表空間) 以 - 個類似目錄的結 構存儲。索引要分類的話,分爲前綴索引、全文本索引等;
13 Mysql 中 MyISAM 和 InnoDB 的區別有哪些?
-
InnoDB 支持事務, MyISAM 不支持
-
InnoDB 支持外鍵,而 MylSAM 不支持。對一個包含外鍵的 InnoDB 錶轉爲 MYISAM 會失敗;
-
InnoDB 是聚集索引,數據文件是和索引綁在一起,必須要有主鍵,通過主鍵索引效率高。
-
InnoDB 不保存 表的具體行數, 執行 select count(*) from table 時需要全表掃描。
-
Innodb 不支持全文索引,而 MyISAM 支持全文索引, 查詢效率上 MyISAM 要高;
14 數據庫表創建注意事項
1、字段名及字段配製合理性
-
剔除關係不密切的字段; 1 字段命名要有規則及相對應的含義 (不要一部分英文,一部分拼音,還有類似 a.b.c 這樣不明含義的字段) ;
-
字段命名儘量不要使用縮寫 (大多數縮寫都不能明確字段含義) ;
-
字段不要大小寫混用 (想要具有可讀性,多個英文單詞可使用下劃線形式連接) ;
-
字段名 不要使用保留字或者關鍵字;
-
保持字段名和類型的一致性;
-
慎重選擇數字類型; 給文本字段留足餘量;
2、系統特殊字段處理及建成後建議
-
添加刪除標記 (例如操作人、刪除時間) ;
-
建立版本機制;
3、表結構合理性配置
-
多型字段的處理 ,就是表中是否存在字段能夠分解成更小獨立的幾部分 (例如: 人可以分爲男人和女人) ;
-
多值字段的處理,可以將表分爲三張表,這樣使得檢索和排序更加有調理,且保證數據的完整性!
4、其它建議
-
對於大數據字段,獨立表進行存儲, 以便影響性能 (例如: 簡介字段) ;
-
使用 varchar 類 型代替 char, 因爲 varchar 會動態分配長度,char 指定長度是固定的; 給表創建主鍵,對於沒有主鍵的表,在查詢和索引定義上有一定的影響;
-
避免表字段運行爲 null, 建議設置默認值 (例如: int 類型設置默認值爲 0) 在索引查詢上,效率立顯; 1 建立索引, 最好建立在唯 - 和非空的字段上,建立太多的索引對後期插入、更新都存在一定的影響 (考慮實際情況來創建) ;
來源:database.51cto.com/art/202010/628634.htm
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/HGDAQH3EaeU8UMz7sNsa_Q