我阿里P7瞭解到的Java面試的一些小內幕!Java崗

我阿里P7瞭解到的Java面試的一些小內幕!Java崗
20道常見MySQL數據庫面試題+解析
  1. 事務四大特性(ACID)原子性、一致性、隔離性、持久性?mysql

  2. 事務的併發?事務隔離級別,每一個級別會引起什麼問題,MySQL默認是哪一個級別?程序員

  3. MySQL常見的三種存儲引擎(InnoDB、MyISAM、MEMORY)的區別?面試

  4. MySQL的MyISAM與InnoDB兩種存儲引擎在,事務、鎖級別,各自的適用場景?sql

  5. 查詢語句不一樣元素(where、jion、limit、group by、having等等)執行前後順序?數據庫

  6. 什麼是臨時表,臨時表何時刪除?編程

  7. MySQL B+Tree索引和Hash索引的區別?緩存

  8. sql查詢語句肯定建立哪一種類型的索引?如何優化查詢?網絡

  9. 彙集索引和非彙集索引區別?併發

  10. 有哪些鎖(樂觀鎖悲觀鎖),select 時怎麼加排它鎖?app

  11. 非關係型數據庫和關係型數據庫區別,優點比較?

  12. 數據庫三範式,根據某個場景設計數據表?

  13. 數據庫的讀寫分離、主從複製,主從複製分析的 7 個問題?

  14. 使用explain優化sql和索引?

  15. MySQL慢查詢怎麼解決?

  16. 什麼是 內鏈接、外鏈接、交叉鏈接、笛卡爾積等?

  17. mysql都有什麼鎖,死鎖斷定原理和具體場景,死鎖怎麼解決?

  18. varchar和char的使用場景?

  19. mysql 高併發環境解決方案?

  20. 數據庫崩潰時事務的恢復機制(REDO日誌和UNDO日誌)?

一、事務四大特性(ACID)原子性、一致性、隔離性、持久性?

原子性(Atomicity)

  • 原子性是指事務包含的全部操做要麼所有成功,要麼所有失敗回滾,所以事務的操做若是成功就必需要徹底應用到數據庫,若是操做失敗則不能對數據庫有任何影響。

一致性(Consistency)

  • 事務開始前和結束後,數據庫的完整性約束沒有被破壞。好比A向B轉帳,不可能A扣了錢,B卻沒收到

隔離性(Isolation)

  • 隔離性是當多個用戶併發訪問數據庫時,好比操做同一張表時,數據庫爲每個用戶開啓的事務,不能被其餘事務的操做所幹擾,多個併發事務之間要相互隔離

同一時間,只容許一個事務請求同一數據,不一樣的事務之間彼此沒有任何干擾。好比A正在從一張銀行卡中取錢,在A取錢的過程結束前,B不能向這張卡轉帳。

關於事務的隔離性數據庫提供了多種隔離級別,稍後會介紹到持久性(Durability)

  • 持久性是指一個事務一旦被提交了,那麼對數據庫中的數據的改變就是永久性的,即使是在數據庫系統遇到故障的狀況下也不會丟失提交事務的操做

二、事務的併發?事務隔離級別,每一個級別會引起什麼問題,MySQL默認是哪一個級別?

從理論上來講, 事務應該彼此徹底隔離, 以免併發事務所致使的問題,然而, 那樣會對性能產生極大的影響, 由於事務必須按順序運行, 在實際開發中, 爲了提高性能, 事務會以較低的隔離級別運行, 事務的隔離級別能夠經過隔離事務屬性指定

2.1事務的併發問題

(1)髒讀:事務A讀取了事務B更新的數據,而後B回滾操做,那麼A讀取到的數據是髒數據

(2)不可重複讀:事務 A 屢次讀取同一數據,事務 B 在事務A屢次讀取的過程當中,對數據做了更新並提交,致使事務A屢次讀取同一數據時,結果所以本事務前後兩次讀到的數據結果會不一致。

(3)幻讀:幻讀解決了不重複讀,保證了同一個事務裏,查詢的結果都是事務開始時的狀態(一致性)。

例如:事務T1對一個表中全部的行的某個數據項作了從「1」修改成「2」的操做 這時事務T2又對這個表中插入了一行數據項,而這個數據項的數值仍是爲「1」而且提交給數據庫。 而操做事務T1的用戶若是再查看剛剛修改的數據,會發現還有跟沒有修改同樣,其實這行是從事務T2中添加的,就好像產生幻覺同樣,這就是發生了幻讀。

小結:不可重複讀的和幻讀很容易混淆,不可重複讀側重於修改,幻讀側重於新增或刪除。解決不可重複讀的問題只需鎖住知足條件的行,解決幻讀須要鎖表。

2.2事務的隔離級別

事務隔離級別

image

  • 讀未提交:另外一個事務修改了數據,但還沒有提交,而本事務中的SELECT會讀到這些未被提交的數據髒讀

  • 不可重複讀:事務 A 屢次讀取同一數據,事務 B 在事務A屢次讀取的過程當中,對數據做了更新並提交,致使事務A屢次讀取同一數據時,結果所以本事務前後兩次讀到的數據結果會不一致。

  • 可重複讀:在同一個事務裏,SELECT的結果是事務開始時時間點的狀態,所以,一樣的SELECT操做讀到的結果會是一致的。可是,會有幻讀現象

  • 串行化:最高的隔離級別,在這個隔離級別下,不會產生任何異常。併發的事務,就像事務是在一個個按照順序執行同樣

2.3 MySQL默認的事務隔離級別爲repeatable-read

  • MySQL 支持 4 中事務隔離級別.

  • 事務的隔離級別要獲得底層數據庫引擎的支持, 而不是應用程序或者框架的支持.

  • Oracle 支持的 2 種事務隔離級別:READ_COMMITED , SERIALIZABLE

2.3補充

  1. SQL規範所規定的標準,不一樣的數據庫具體的實現可能會有些差別

  2. MySQL中默認事務隔離級別是「可重複讀」時並不會鎖住讀取到的行

  • 事務隔離級別未提交讀時,寫數據只會鎖住相應的行。

  • 事務隔離級別爲可重複讀時,寫數據會鎖住整張表。

  • 事務隔離級別爲串行化時,讀寫數據都會鎖住整張表。

隔離級別越高越能保證數據的完整性和一致性,可是對併發性能的影響也越大,魚和熊掌不可兼得啊。對於多數應用程序,能夠優先考慮把數據庫系統的隔離級別設爲Read Committed,它可以避免髒讀取,並且具備較好的併發性能。儘管它會致使不可重複讀、幻讀這些併發問題,在可能出現這類問題的個別場合,能夠由應用程序採用悲觀鎖或樂觀鎖來控制。

image.png

21條MySQL性能調優經驗
  1. 爲查詢緩存優化你的查詢

  2. EXPLAIN你的SELECT查詢

  3. 當只要一行數據時使用LIMIT 1

  4. 爲搜索字段建索引

  5. 在Join表的時候使用至關類型的例,並將其索引

  6. 千萬不要 ORDER BY RAND()

  7. 避免 SELECT *

  8. 永遠爲每張表設置一個 ID

  9. 使用 ENUM 而不是 VARCHAR

  10. 從 PROCEDURE ANALYSE() 取得建議

  11. 儘量的使用 NOT NULL

  12. Prepared Statements

  13. 無緩衝的查詢

  14. 把 IP 地址存成 UNSIGNED INT

  15. 固定長度的表會更快

  16. 垂直分割

  17. 拆分大的 DELETE 或 INSERT 語句

  18. 越小的列會越快

  19. 選擇正確的存儲引擎

  20. 使用一個對象關係映射器(Object Relational Mapper)

  21. 當心「永久連接」

image

總結

整體來講,若是你想轉行從事程序員的工做,Java開發必定能夠做爲你的第一選擇。可是無論你選擇什麼編程語言,提高本身的硬件實力纔是拿高薪的惟一手段。

若是你以這份學習路線來學習,你會有一個比較系統化的知識網絡,也不至於把知識學習得很零散。我我的是徹底不建議剛開始就看《Java編程思想》、《Java核心技術》這些書籍,看完你確定會放棄學習。建議能夠看一些視頻來學習,當本身能上手再買這些書看又是很是有收穫的事了。

相關文章
相關標籤/搜索