1. 程式人生 > 其它 >不是吧阿sir(1),輕鬆拿到了阿里Java高階開發工程師的offer

不是吧阿sir(1),輕鬆拿到了阿里Java高階開發工程師的offer

不是吧阿sir(1),輕鬆拿到了阿里Java高階開發工程師的offer

讀未提交: 最低的隔離級別,允許讀取尚未提交的資料變更,可能會導致髒讀、幻讀或不可重複讀。

讀已提交: 允許讀取併發事務已經提交的資料,可以阻?髒讀,但是幻讀或不可重複讀仍有可能發?。

可重複讀: 同?欄位的多次讀取結果都是?致的,除?資料是被本身事務??所修改,可以阻?髒讀和不可重複讀,但幻讀仍有可能發?。

可序列化: 最?的隔離級別,完全服從ACID的隔離級別。所有的事務依次逐個執?,這樣事務之間就完全不可能產??擾,也就是說,該級別可以防?髒讀、不可重複讀以及幻讀。

| 隔離級別 | 併發問題 |

| --- | --- |

| 讀未提交 | 可能會導致髒讀、幻讀或不可重複讀 |

| 讀已提交 | 可能會導致幻讀或不可重複讀 |

| 可重複度 | 可能會導致幻讀 |

| 可序列化 | 不會產??擾 |

3、Mysql預設隔離級別?如何保證併發安全?

預設隔離級別: 可重複讀;

? 同?欄位的多次讀取結果都是?致的,除?資料是被本身事務??所修改;

? 可重複讀是有可能出現幻讀的,如果要保證絕對的安全只能把隔離級別設定成SERIALIZABLE;這樣所有事務都只能順序執行,自然不會因為併發有什麼影響了,但是效能會下降許多。

? 第二種方式,使用更新的版本控制。維護一個欄位作為updateversion,修改時updateversion也作為一個引數傳入,在條件語句中新增例如where id=? and update_version = ? 當然set裡面要update_version+1。這樣可以控制到每次只能有一個人更新一個版本。

4、RR和RC如何實現的?RR使用場景?

? 事務隔離級別RC(read commit)和RR(repeatable read)兩種事務隔離級別基於多版本併發控制MVCC(multi-version concurrency control)來實現。

? 由於RC隔離級別需要保持語句級別的一致性,事務中每一次讀取都是訪問當前時間點的已提交資料,因此事務中多條查詢語句會建立多個不同的ReadView,開銷較大,複雜度更高;而對於RR隔離級別,僅需要一個版本的ReadView,消耗更少,因此Mysql預設使用RR隔離級別。

? RC隔離級別獲得的是語句級讀一致性;RR隔離級別獲得的是事務級讀一致性

? 對於RC隔離級別,訪問的資料是每次語句執行時間點的資料,而對於RR隔離級別,訪問的資料是事務中第一條語句執行時間點的資料。

白嫖資料

5、隔離級別的單位是資料表還是資料行?如序列化級別,兩個事務訪問不同的資料行,能併發?

? 讀未提交:不加鎖

? 讀已提交:加行鎖,只鎖要修改的行

? 可重複讀:加行鎖,鎖定的是查詢的行

? 可序列化:加表鎖,在讀取的每張表上加鎖

? 序列化級別:讀不同的行,可以併發

6、儲存引擎Innodb和Myisam的區別以及使用場景

Myisam: 支援表鎖,適合讀密集的場景,不支援外來鍵,不支援事務,索引與資料在不同的檔案

Innodb: 支援行、表鎖,預設為行鎖,適合併發場景,支援外來鍵,支援事務,索引與資料同一檔案

7、 介紹Inodb鎖機制,行鎖,表鎖,意向鎖

InnoDB?持?級鎖(row-level locking)和表級鎖,預設為?級鎖

InnoDB按照不同的分類的鎖:

共享/排它鎖(Shared and Exclusive Locks):行級別鎖,

意向鎖(Intention Locks),表級別鎖

間隙鎖(Gap Locks),鎖定一個區間

記錄鎖(Record Locks),鎖定一個行記錄

表級鎖:

? Mysql中鎖定 粒度最大 的一種鎖,對當前操作的整張表加鎖,實現簡單 ,資源消耗也比較少,加鎖快,不會出現死鎖 。其鎖定粒度最大,觸發鎖衝突的概率最高,併發度最低,MyISAM和 InnoDB引擎都支援表級鎖。

行級鎖:

? Mysql中鎖定 粒度最小 的一種鎖,只針對當前操作的行進行加鎖。 行級鎖能大大減少資料庫操作的衝突。其加鎖粒度最小,併發度高,但加鎖的開銷也最大,加鎖慢,會出現死鎖。 InnoDB支援的行級鎖,包括如下幾種:

? 記錄鎖(Record Lock): 對索引項加鎖,鎖定符合條件的行。其他事務不能修改和刪除加鎖項;

? 間隙鎖(Gap Lock): 對索引項之間的“間隙”加鎖,鎖定記錄的範圍(對第一條記錄前的間隙或最後一條將記錄後的間隙加鎖),不包含索引項本身。其他事務不能在鎖範圍內插入資料,這樣就防止了別的事務新增幻影行。

? Next-key Lock: 鎖定索引項本身和索引範圍。即Record Lock和Gap Lock的結合。可解決幻讀問題。

意向鎖:

? 當一個事務在需要獲取資源的鎖定時,如果該資源已經被排他鎖佔用,則資料庫會自動給該事務申請一個該表的意向鎖。如果自己需要一個共享鎖定,就申請一個意向共享鎖。如果需要的是某行(或者某些行)的排他鎖定,則申請一個意向排他鎖。

8、介紹MVCC.

? MVCC是一種多版本併發控制機制,在大多數情況下代替行級鎖,使用MVCC,能降低其系統開銷.

? MVCC是通過儲存資料在某個時間點的快照來實現的. 不同儲存引擎的MVCC實現是不同的,典型的有樂觀併發控制和悲觀併發控制.

? InnoDB的MVCC,是通過在每行記錄後面儲存兩個隱藏的列來實現的,這兩個列,分別儲存了這個行的建立時間,一個儲存的是行的刪除時間。這裡儲存的並不是實際的時間值,而是系統版本號(可以理解為事務的ID),每開始一個新的事務,系統版本號就會自動遞增,事務開始時刻的系統版本號會作為事務的ID.

? InnoDB只會查詢版本早於當前事務版本的資料行(也就是,行的系統版本號小於或等於事務的系統版本號),這樣可以確保事務讀取的行,要麼是在事務開始前已經存在的,要麼是事務自身插入或者修改過的.

? 1.MVCC手段只適用於Msyql隔離級別中的讀已提交(Read committed)和可重複讀(Repeatable Read).

? 2.Read uncimmitted由於存在髒讀,即能讀到未提交事務的資料行,所以不適用MVCC.

? 原因是MVCC的建立版本和刪除版本只要在事務提交後才會產生。客觀上,我們認為他就是樂觀鎖的一整實現方式,就是每行都有版本號,儲存時根據版本號決定是否成功。

9、雜湊索引是如何實現的?

? 雜湊索引用索引列的值計算該值的hashCode,然後在hashCode相應的位置存執該值所在行資料的物理位置,因為使用雜湊演算法,因此訪問速度非常快,但是一個值只能對應一個hashCode,而且是雜湊的分佈方式,因此雜湊索引不支援範圍查詢和排序的功能

10、資料庫索引為什麼使用B+樹,相對於B樹有什麼優點?為什麼不能紅黑樹?

因為:

? B+樹的磁碟讀寫代價低,更少的查詢次數,查詢效率更加穩定,有利於對資料庫的掃描

? 相對B樹,B+樹是B樹的升級版,只是把非葉子節點冗餘一下,這麼做的好處是為了提高範圍查詢的效率,解決資料庫遍歷效率低下問題;B+樹只有葉節點存放資料,其餘節點用來索引,而B樹是每個索引節點都會有Data域。

? 在大規模資料儲存的時候,紅黑樹往往出現由於樹的深度過大而造成磁碟IO讀寫過於頻繁,進而導致效率低下的情況。所以,只要我們通過某種較好的樹結構減少樹的結構儘量減少樹的高度,B樹與B+樹可以有多個子女,從幾十到上千,可以降低樹的高度。

? 磁碟預讀原理:將一個節點的大小設為等於一個頁,這樣每個節點只需要一次I/O就可以完全載入。為了達到這個目的,在實際實現B-Tree還需要使用如下技巧:每次新建節點時,直接申請一個頁的空間,這樣就保證一個節點物理上也儲存在一個頁裡,加之計算機儲存分配都是按頁對齊的,就實現了一個node只需一次I/O。

11、聚簇索引和非聚簇索引區別

? 聚簇索引: 將資料儲存與索引放到了一塊,索引結構的葉子節點儲存了行資料

? 非聚簇索引: 將資料與索引分開儲存,索引結構的葉子節點指向了資料對應的位置

? 聚簇索引的葉子節點就是資料節點,而非聚簇索引的葉子節點仍然是索引節點,只不過有指向對應資料塊的指標。

12、回表查詢和覆蓋索引

白嫖資料

普通索引 需要掃描兩遍索引樹

(1)先通過普通索引定位到主鍵值id=5;

(2)在通過聚集索引定位到行記錄;

這就是所謂的回表查詢,先定位主鍵值,再定位行記錄,它的效能較掃一遍索引樹更低。

覆蓋索引:如果where條件的列和返回的資料在一個索引中,那麼不需要回查表,那麼就叫覆蓋索引。

實現覆蓋索引:常見的方法是,將被查詢的欄位,建立到聯合索引裡去。

13、如何建立索引?

CREATE TABLE 表名( 欄位名 資料型別 [完整性約束條件],

……, [UNIQUE | FULLTEXT | SPATIAL] INDEX | KEY [索引名](欄位名1 [(長度)] [ASC | DESC]) [USING 索引方法] );

說明: UNIQUE:可選。表示索引為唯一性索引。 FULLTEXT:可選。表示索引為全文索引。 SPATIAL:可選。表示索引為空間索引。

INDEX和KEY:用於指定欄位為索引,兩者選擇其中之一就可以了,作用是一樣的。 索引名:可選。給建立的索引取一個新名稱。

欄位名1:指定索引對應的欄位的名稱,該欄位必須是前面定義好的欄位。 長度:可選。指索引的長度,必須是字串型別才可以使用。

ASC:可選。表示升序排列。 DESC:可選。表示降序排列。 注:索引方法預設使用B+TREE。

ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT | SPATIAL] INDEX | KEY [索引名]

(欄位名1 [(長度)] [ASC | DESC]) [USING 索引方法];

CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX 索引名 ON 表名(欄位名) [USING

索引方法];

14、如何避免全表掃描?

1.對查詢進行優化,應考慮在 where 及 order by 涉及的列上建立索引。

2.應儘量避免在 where 子句中對欄位進行 null 值判斷

3.應儘量避免在 where 子句中使用!=或<>操作符

4.in 和 not in 要慎用

否則將導致引擎放棄使用索引而進行全表掃描

15、Explain語句各欄位的意義

mysql> explain select * from staff;

±—±------------±------±-----±--------------±-----±--------±-----±-----±------+ | id | select_type | table | type | possible_keys | key | key_len |

ref | rows | Extra |

±—±------------±------±-----±--------------±-----±--------±-----±-----±------+ | 1 | SIMPLE | staff | ALL | NULL | NULL | NULL |

NULL | 2 | NULL |

±—±------------±------±-----±--------------±-----±--------±-----±-----±------+ 1 row in set

| 列 | 含義 |

| --- | --- |

| id | 查詢序號,序號越大越先執行,一樣則按順序執行 |

| select_type | 查詢型別,SIMPLE、PRIMARY、UNION、SUBQUERY等 |

| table | 表名 |

| type | join型別,const,eq_ref,ref等 |

| possible_keys | join型別 |

| key | 實際選擇的索引 |

| ken_len | 索引的長度 |

| ref | 與索引作比較的列 |

| rows | 要檢索的行數 |

| Extra | 額外資訊 |

16、最左字首!!聯合索引B+樹是如何建立的?是如何查詢的?當where子句中出現>時,聯合索引命中是如何的?

? 最左字首原則主要使用在聯合索引中,聯合索引的B+Tree是按照第一個關鍵字進行索引排列的。

最後,附一張自己面試前準備的腦圖:

面試前一定少不了刷題,為了方便大家複習,我分享一波個人整理的面試大全寶典

  • Java核心知識整理
  • Spring全家桶(實戰系列)

Step3:刷題

既然是要面試,那麼就少不了刷題,實際上春節回家後,哪兒也去不了,我自己是刷了不少面試題的,所以在面試過程中才能夠做到心中有數,基本上會清楚面試過程中會問到哪些知識點,高頻題又有哪些,所以刷題是面試前期準備過程中非常重要的一點。

以下是我私藏的面試題庫:

很多人感嘆“學習無用”,實際上之所以產生無用論,是因為自己想要的與自己所學的匹配不上,這也就意味著自己學得遠遠不夠。無論是學習還是工作,都應該有主動性,所以如果擁有大廠夢,那麼就要自己努力去實現它。

資料領取方式:Java全套學習手冊

以上學習資料均免費分享,最後祝願各位身體健康,順利拿到心儀的offer!