您當前的位置:首頁 > 書法

14個數據庫面試必備問題

作者:由 挨踢-IT人加油 發表于 書法時間:2022-01-24

1

為什麼使用資料索引能提高效率

資料索引的儲存是 有序的

在有序的情況下, 透過索引查詢一個數據是無需遍歷索引記錄的

極端情況下,資料索引的查詢效率為二分法查詢效率,趨近於log2(N)

2

B+樹索引和雜湊索引的區別

B+樹是一個平衡的多叉樹,從根節點到每個葉子節點的高度差值不超過1,而且同層級的節點間有指標相互連結,是有序的,如下圖:

14個數據庫面試必備問題

雜湊索引就是採用一定的雜湊演算法,把鍵值換算成新的雜湊值,檢索時不需要類似B+樹那樣從根節點到葉子節點逐級查詢,只需一次雜湊演算法即可,是無序的,如下圖所示:

14個數據庫面試必備問題

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建立索引,最好建立在唯-和非空的欄位上,建立太多的索引對後期插入、更新都存在一定的影響(考慮實際情況來建立) ;

相關學習推薦

DBA資料庫管理必備認證『ORACLE』

Oracle資料恢復手把手教程

標簽: 索引  查詢  雜湊  分割槽  InnoDB