備戰春招之MySQL:歷年高頻面試真題梳理及眾多學習筆記和書籍

追逐仰望星空 發佈 2019-12-29T02:18:15+00:00

這次就不賣關子了,直接步入主題吧~~01 資料庫歷年高頻真題梳理1、MySQL 中有哪幾種鎖?2、MySQL 中有哪些不同的表格?

這次就不賣關子了,直接步入主題吧~~

01 資料庫歷年高頻真題梳理

  • 1、MySQL 中有哪幾種鎖?
  • 2、MySQL 中有哪些不同的表格?
  • 3、簡述在 MySQL 資料庫中 MyISAM 和 InnoDB 的區別
  • 4、MySQL 中 InnoDB 支持的四種事務隔離級別名稱,以及逐級之間的區別?
  • 5、CHAR 和 VARCHAR 的區別?
  • 6、主鍵和候選鍵有什麼區別?
  • 7、myisamchk 是用來做什麼的?
  • 8、如果一個表有一列定義為 TIMESTAMP,將發生什麼?
  • 9、你怎麼看到為表格定義的所有索引?
  • 10、LIKE 聲明中的%和_是什麼意思?
  • 11、列對比運算符是什麼?
  • 12、BLOB 和 TEXT 有什麼區別?
  • 13、MySQL_fetch_array 和 MySQL_fetch_object 的區別是什麼?
  • 14、MyISAM 表格將在哪裡存儲,並且還提供其存儲格式?
  • 15、MySQL 如何優化 DISTINCT?
  • 16、如何顯示前 50 行?
  • 17、可以使用多少列創建索引?
  • 18、NOW()和 CURRENT_DATE()有什麼區別?
  • 19、什麼是非標準字符串類型?
  • 20、什麼是通用 SQL 函數?
  • 21、MySQL 支持事務嗎?
  • 22、MySQL 里記錄貨幣用什麼欄位類型好
  • 23、MySQL 有關權限的表都有哪幾個?
  • 24、列的字符串類型可以是什麼?
  • 25、MySQL 資料庫作發布系統的存儲,一天五萬條以上的增量,預計運維三年,怎麼優化?
  • 26、鎖的優化策略
  • 27、索引的底層實現原理和優化
  • 28、什麼情況下設置了索引但無法使用
  • 29、實踐中如何優化 MySQL
  • 30、優化資料庫的方法
  • 31、簡單描述 MySQL 中,索引,主鍵,唯一索引,聯合索引的區別,對資料庫的性能有什麼影響(從讀寫兩方面)
  • 32、資料庫中的事務是什麼?
  • 33、SQL 注入漏洞產生的原因?如何防止?
  • 34、為表中的欄位選擇合適得數據類型
  • 35、存儲時期
  • 36、對於關係型資料庫而言,索引是相當重要的概念,請回答有關索引的幾個問題:
  • 37、解釋 MySQL 外連接、內連接與自連接的區別
  • 38、Myql 中的事務回滾機制概述
  • 39、SQL 語言包括哪幾部分?每部分都有哪些操作關鍵字?
  • 40、完整性約束包括哪些?
  • 41、什麼是鎖?
  • 42、什麼叫視圖?游標是什麼?
  • 43、什麼是存儲過程?用什麼來調用?
  • 44、如何通俗地理解三個範式?
  • 45、什麼是基本表?什麼是視圖?
  • 46、試述視圖的優點?
  • 47、 NULL 是什麼意思
  • 48、主鍵、外鍵和索引的區別?
  • 49、你可以用什麼來確保表格里的欄位只接受特定範圍里的值?
  • 50、說說對 SQL 語句優化有哪些方法?(選擇幾條)

1、MySQL 中有哪幾種鎖?

· 表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖衝突的機率最高,並發度最低。

· 行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的機率最低,並發度也最高。

· 頁面鎖:開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度界於表鎖和行鎖之間,並發度一般。

2、MySQL 中有哪些不同的表格?

共有 5 種類型的表格:

· MyISAM

· Heap

· Merge

· INNODB

· ISAM

3、簡述在 MySQL 資料庫中 MyISAM 和 InnoDB 的區別

MyISAM:

· 不支持事務,但是每次查詢都是原子的;

· 支持表級鎖,即每次操作是對整個表加鎖;

· 存儲表的總行數;

· 一個 MYISAM 表有三個文件:索引文件、表結構文件、數據文件;

· 採用菲聚集索引,索引文件的數據域存儲指向數據文件的指針。輔索引與主索引基本一致,但是輔索引不用保證唯一性。

InnoDb:

· 支持 ACID 的事務,支持事務的四種隔離級別;

· 支持行級鎖及外鍵約束:因此可以支持寫並發;

不存儲總行數:

一個 InnoDb 引擎存儲在一個文件空間(共享表空間,表大小不受作業系統控制,一個表可能分布在多個文件里),也有可能為多個(設置為獨立表空,表大小受作業系統文件大小限制,一般為 2G),受作業系統文件大小的限制;

主鍵索引採用聚集索引(索引的數據域存儲數據文件本身),輔索引的數據域存儲主鍵的值;因此從輔索引查找數據,需要先通過輔索引找到主鍵值,再訪問輔索引;最好使用自增主鍵,防止插入數據時,為維持 B+樹結構,文件的大調整。

4、MySQL 中 InnoDB 支持的四種事務隔離級別名稱,以及逐級之間的區別?

SQL 標準定義的四個隔離級別為:

  • 1. read uncommited :讀到未提交數據
  • 2. read committed:髒讀,不可重複讀
  • 3. repeatable read:可重讀
  • 4. serializable :串行事物

5、CHAR 和 VARCHAR 的區別?

  • 1. CHAR 和 VARCHAR 類型在存儲和檢索方面有所不同
  • 2. CHAR 列長度固定為創建表時聲明的長度,長度值範圍是 1 到 255 當 CHAR值被存儲時,它們被用空格填充到特定長度,檢索 CHAR 值時需刪除尾隨空格。

由於篇幅有限,這裡就不一一列出所有的答案了,下面還要為大家展示一下MySQL的學習筆記及書籍,這份資料庫歷年高頻真題梳理已整理成Word文檔,有需要的小夥伴可以私信「資料庫」免費領取~~


02 資料庫學習筆記及書籍

(1)MySQL學習高頻知識點

  • 1、事務四大特性(ACID)原子性、一致性、隔離性、持久性?
  • 2、事務的並發?事務隔離級別,每個級別會引發什麼問題,MySQL默認是哪個級別?
  • 3、MySQL常見的三種存儲引擎(InnoDB、MyISAM、MEMORY)的區別?
  • 4、MySQL的MyISAM與InnoDB兩種存儲引擎在,事務、鎖級別,各自的適用場景?
  • 5、查詢語句不同元素(where、jion、limit、group by、having等等)執行先後順序?
  • 6、什麼是臨時表,臨時表什麼時候刪除?
  • 7、MySQL B+Tree索引和Hash索引的區別?
  • 8、sql查詢語句確定創建哪種類型的索引?如何優化查詢?
  • 9、聚集索引和非聚集索引區別?
  • 10、有哪些鎖(樂觀鎖悲觀鎖),select 時怎麼加排它鎖?
  • 11、非關係型資料庫和關係型資料庫區別,優勢比較?
  • 12、資料庫三範式,根據某個場景設計數據表?
  • 13、資料庫的讀寫分離、主從複製,主從複製分析的 7 個問題?
  • 14、使用explain優化sql和索引?
  • 15、MySQL慢查詢怎麼解決?
  • 16、什麼是 內連接、外連接、交叉連接、笛卡爾積等?
  • 17、mysql都有什麼鎖,死鎖判定原理和具體場景,死鎖怎麼解決?
  • 18、varchar和char的使用場景?
  • 19、mysql 高並發環境解決方案?
  • 20、資料庫崩潰時事務的恢復機制(REDO日誌和UNDO日誌)?

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

原子性(Atomicity)

· 原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾,因此事務的操作如果成功就必須要完全應用到資料庫,如果操作失敗則不能對資料庫有任何影響。

一致性(Consistency)

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

隔離性(Isolation)

· 隔離性是當多個用戶並發訪問資料庫時,比如操作同一張表時,資料庫為每一個用戶開啟的事務,不能被其他事務的操作所干擾,多個並發事務之間要相互隔離

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

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

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

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

從理論上來說, 事務應該彼此完全隔離, 以避免並發事務所導致的問題,然而, 那樣會對性能產生極大的影響, 因為事務必須按順序運行, 在實際開發中, 為了提升性能, 事務會以較低的隔離級別運行, 事務的隔離級別可以通過隔離事務屬性指定

2.1事務的並發問題

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

(2)不可重複讀:事務 A 多次讀取同一數據,事務 B 在事務A多次讀取的過程中,對數據作了更新並提交,導致事務A多次讀取同一數據時,結果因此本事務先後兩次讀到的數據結果會不一致。

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

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

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

2.2事務的隔離級別


  • 讀未提交:另一個事務修改了數據,但尚未提交,而本事務中的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,它能夠避免髒讀取,而且具有較好的並發性能。儘管它會導致不可重複讀、幻讀這些並發問題,在可能出現這類問題的個別場合,可以由應用程式採用悲觀鎖或樂觀鎖來控制。

(2)MySQL學習路線圖(xmind)

(3)MySQL學習書籍:MySQL+技術內幕:InnoDB存儲引擎-3.pdf

03 資料庫性能優化

(1)MySQ性能優化21個最佳實踐

  • 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、小心「永久連結」

(2)MySQL優化問題學習路線圖(xmind)


最後的最後:讀者彩蛋

今天關於備戰春招之MySQL就分享這麼多,如果你對文中提到的各種資料庫學習資料感興趣,可以轉發+後台私信「資料庫」,按照回復操作即可免費領取這些資料庫學習資料,讓我們一起備戰春招吧!


最後說到性能優化問題,前些日子還總結了一波MySQL+Tomcat+JVM的性能優化問題匯總,這裡也一起分享出來給大家學習參考一下下,同樣私信「資料庫」即可免費獲取!!

關鍵字: