高級java工程師面試題

1.char爲什麼比varchar快?
varchar存儲的時候前兩個字節會存儲整個字符串的長度,最後一個字節會存儲標誌符。varchar讀取到內存中的時候,是最大的設置,比如varchar(200),雖然實際值存儲4個字符,但是在內存還是會佔用200字符。varchar如果長度過大,還會造成拆分或者分頁機制。如果頻繁的修改字符串的長度,varchar還要涉及重新計算長度等。總體來說,char快的原因是用空間換時間。
2.各個索引類型:
普通索引:最基本的索引,沒有任何限制
唯一索引:與"普通索引"類似,不同的就是:索引列的值必須唯一,但允許有空值。
主鍵索引:它 是一種特殊的唯一索引,不允許有空值。
全文索引:僅可用於 MyISAM 表,針對較大的數據,生成全文索引很耗時好空間。
組合索引:爲了更多的提高mysql效率可建立組合索引,遵循”最左前綴“原則。創建複合索引時應該將最常用(頻率)作限制條件的列放在最左邊,依次遞減。
3.主鍵索引爲何比唯一索引快?
聚集(clustered)索引,也叫聚簇索引。
定義:數據行的物理順序與列值(一般是主鍵的那一列)的邏輯順序相同,一個表中只能擁有一個聚集索引。主鍵索引的葉子節點會保存整行的全部數據。

其實按照定義,除了聚集索引以外的索引都是非聚集索引,只是人們想細分一下非聚集索引,分成普通索引,唯一索引,全文索引。如果非要把非聚集索引類比成現實生活中的東西,那麼非聚集索引就像新華字典的偏旁字典,他結構順序與實際存放順序不一定一致。而聚促索引是按照拼音查的拼音字典。
非聚集索引葉節點仍然是索引節點,只是有一個指針指向對應的數據塊,此如果使用非聚集索引查詢,而查詢列中包含了其他該索引沒有覆蓋的列,那麼他還要進行第二次的查詢,查詢節點上對應的數據行的數據。
使用以下語句進行查詢,不需要進行二次查詢,直接就可以從非聚集索引的節點裏面就可以獲取到查詢列的數據。

select id, username from t1 where username = '小明'
select username from t1 where username = '小明'

但是使用以下語句進行查詢,就需要二次的查詢去獲取原數據行的score:

select username, score from t1 where username = '小明'

4.數據庫引擎的區別
MyISAM與InnoDB的區別
  InnoDB和MyISAM是許多人在使用MySQL時最常用的兩個表類型,這兩個表類型各有優劣,視具體應用而定。基本的差別爲:MyISAM類型不支持事務處理等高級處理,而InnoDB類型支持。MyISAM類型的表強調的是性能,其執行數度比InnoDB類型更快,但是不提供事務支持,而InnoDB提供事務支持已經外部鍵等高級數據庫功能。
一般來說,MyISAM適合:
(1)做很多count 的計算;
(2)插入不頻繁,查詢非常頻繁;
(3)沒有事務。
InnoDB適合:
(1)可靠性要求比較高,或者要求事務;
(2)表更新和查詢都相當的頻繁,並且表鎖定的機會比較大的情況指定數據引擎的創建
讓所有的靈活性成爲可能的開關是提供給ANSI SQL的MySQL擴展——TYPE參數。MySQL能夠讓你在表格這一層指定數據庫引擎,所以它們有時候也指的是table formats。下面的示例代碼表明瞭如何創建分別使用MyISAM、ISAM和HEAP引擎的表格。要注意,創建每個表格的代碼是相同的,除了最後的 TYPE參數,這一參數用來指定數據引擎。
hash索引的限制
1、Hash索引必須進行二次查找
  使用哈市索引兩次查找,第一次找到相應的行,第二次讀取數據,但是被頻繁訪問到的行一般會緩存在內存中,這點對數據庫性能的影響不大。
2、hash索引不能用於外排序 hash索引存儲的是hash碼而不是鍵值,所以無法用於外排序
3、hash索引不支持部分索引查找也不支持範圍查找 只能用到等值查詢,不能範圍和模糊查詢  
4、hash索引中的hash碼的計算可能存在hash衝突
當出現hash衝突的時候,存儲引擎必須遍歷整個鏈表中的所有行指針,逐行比較,直到找到所有的符合條件的行,若hash衝突很多的話,一些索引的維護代價機會很高,所以說hash索引不適用於選擇性很差的列上(重複值很多)。姓名、性別、身份證

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