這15道MySQL面試題,解決了90%的面試官
前言:
MySQL 是我們開發常常接觸的資料庫,在很多小夥伴找工作的時候都會被 MySQL 的一些理論知識給嚇到。畢竟 MySQL涉及到資料儲存、鎖、磁碟尋道、分頁等作業系統概念,而且網際網路對 MySQL 的注重程度是不言而喻的,所以要加緊對 MySQL 的研究。
1.資料庫三正規化是什麼?
另外本人整理了20年面試題大全,包含spring、併發、資料庫、Redis、分散式、dubbo、JVM、微服務等方面總結,下圖是部分截圖,需要的話點這裡點這裡,暗號CSDN。
- 第一正規化(1NF):欄位具有原子性,不可再分。(所有關係型資料庫系統都滿足第一正規化資料庫表中的欄位都是單一屬性的,不可再分)
- 第二正規化(2NF)是在第一正規化(1NF)的基礎上建立起來的,即滿足第二正規化(2NF)必須先滿足第一正規化(1NF)。要求資料庫表中的每個例項或行必須可以被惟一地區分。通常需要為表加上一個列,以儲存各個例項的惟一標識。這個惟一屬性列被稱為主關鍵字或主鍵。
- 滿足第三正規化(3NF)必須先滿足第二正規化(2NF)。簡而言之,第三正規化(3NF)要求一個資料庫表中不包含已在其它表中已包含的非主關鍵字資訊。 >所以第三正規化具有如下特徵: >>1. 每一列只有一個值 >>2. 每一行都能區分。 >>3. 每一個表都不包含其他表已經包含的非主關鍵字資訊。
2.有哪些資料庫優化方面的經驗?
- 用PreparedStatement, 一般來說比Statement效能高:一個sql 發給伺服器去執行,涉及步驟:語法檢查、語義分析, 編譯,快取。
- 有外來鍵約束會影響插入和刪除效能,如果程式能夠保證資料的完整性,那在設計資料庫時就去掉外來鍵。
- 表中允許適當冗餘,譬如,主題帖的回覆數量和最後回覆時間等
- UNION ALL 要比UNION快很多,所以,如果可以確認合併的兩個結果集中不包含重複資料且不需要排序時的話,那麼就使用UNION ALL。 >>UNION和UNION ALL關鍵字都是將兩個結果集合併為一個,但這兩者從使用和效率上來說都有所不同。 >1. 對重複結果的處理:UNION在進行錶連結後會篩選掉重複的記錄,Union All不會去除重複記錄。 >2. 對排序的處理:Union將會按照欄位的順序進行排序;UNION ALL只是簡單的將兩個結果合併後就返回。
3.請簡述常用的索引有哪些種類?
- 普通索引: 即針對資料庫表建立索引
- 唯一索引: 與普通索引類似,不同的就是:MySQL資料庫索引列的值必須唯一,但允許有空值
- 主鍵索引: 它是一種特殊的唯一索引,不允許有空值。一般是在建表的時候同時建立主鍵索引
- 組合索引: 為了進一步榨取MySQL的效率,就要考慮建立組合索引。即將資料庫表中的多個欄位聯合起來作為一個組合索引。
4.以及在mysql資料庫中索引的工作機制是什麼?
資料庫索引,是資料庫管理系統中一個排序的資料結構,以協助快速查詢、更新資料庫表中資料。索引的實現通常使用B樹及其變種B+樹
5.MySQL的基礎操作命令:
- MySQL 是否處於執行狀態:Debian 上執行命令 service mysql status,在RedHat 上執行命令 service mysqld status
- 開啟或停止 MySQL 服務 :執行命令 service mysqld start 開啟服務;執行命令 service mysqld stop 停止服務
- Shell 登入 MySQL: 執行命令 mysql -u root -p
- 列出所有資料庫:執行命令 show databases;
- 切換到某個資料庫並在上面工作:執行命令 use databasename; 進入名為 databasename 的資料庫
- 列出某個資料庫內所有表: show tables;
- 獲取表內所有 Field 物件的名稱和型別 :describe table_name;
6.mysql的複製原理以及流程。
Mysql內建的複製功能是構建大型,高效能應用程式的基礎。將Mysql的資料分佈到多個系統上去,這種分佈的機制,是通過將Mysql的某一臺主機的資料複製到其它主機(slaves)上,並重新執行一遍來實現的。 * 複製過程中一個伺服器充當主伺服器,而一個或多個其它伺服器充當從伺服器。主伺服器將更新寫入二進位制日誌檔案,並維護檔案的一個索引以跟蹤日誌迴圈。這些日誌可以記錄傳送到從伺服器的更新。 當一個從伺服器連線主伺服器時,它通知主伺服器在日誌中讀取的最後一次成功更新的位置。從伺服器接收從那時起發生的任何更新,然後封鎖並等待主伺服器通知新的更新。
過程如下 :
- 主伺服器把更新記錄到二進位制日誌檔案中。
- 從伺服器把主伺服器的二進位制日誌拷貝到自己的中繼日誌(replay log)中。
- 從伺服器重做中繼日誌中的時間,把更新應用到自己的資料庫上。
7.mysql支援的複製型別?
- 基於語句的複製: 在主伺服器上執行的SQL語句,在從伺服器上執行同樣的語句。MySQL預設採用基於語句的複製,效率比較高。 一旦發現沒法精確複製時,會自動選著基於行的複製。
- 基於行的複製:把改變的內容複製過去,而不是把命令在從伺服器上執行一遍. 從mysql5.0開始支援
- 混合型別的複製: 預設採用基於語句的複製,一旦發現基於語句的無法精確的複製時,就會採用基於行的複製。
8.mysql中myisam與innodb的區別?
- 事務支援 > MyISAM:強調的是效能,每次查詢具有原子性,其執行數度比InnoDB型別更快,但是不提供事務支援。 > InnoDB:提供事務支援事務,外部鍵等高階資料庫功能。 具有事務(commit)、回滾(rollback)和崩潰修復能力(crash recovery capabilities)的事務安全(transaction-safe (ACID compliant))型表。
- InnoDB支援行級鎖,而MyISAM支援表級鎖. >> 使用者在操作myisam表時,select,update,delete,insert語句都會給表自動加鎖,如果加鎖以後的表滿足insert併發的情況下,可以在表的尾部插入新的資料。
- InnoDB支援MVCC, 而MyISAM不支援
- InnoDB支援外來鍵,而MyISAM不支援
- 表主鍵 > MyISAM:允許沒有任何索引和主鍵的表存在,索引都是儲存行的地址。 > InnoDB:如果沒有設定主鍵或者非空唯一索引,就會自動生成一個6位元組的主鍵(使用者不可見),資料是主索引的一部分,附加索引儲存的是主索引的值。
- InnoDB不支援全文索引,而MyISAM支援。
- 可移植性、備份及恢復 > MyISAM:資料是以檔案的形式儲存,所以在跨平臺的資料轉移中會很方便。在備份和恢復時可單獨針對某個表進行操作。 > InnoDB:免費的方案可以是拷貝資料檔案、備份 binlog,或者用 mysqldump,在資料量達到幾十G的時候就相對痛苦了
- 儲存結構 > MyISAM:每個MyISAM在磁碟上儲存成三個檔案。第一個檔案的名字以表的名字開始,副檔名指出檔案型別。.frm檔案儲存表定義。資料檔案的副檔名為.MYD (MYData)。索引檔案的副檔名是.MYI (MYIndex)。 > InnoDB:所有的表都儲存在同一個資料檔案中(也可能是多個檔案,或者是獨立的表空間檔案),InnoDB表的大小隻受限於作業系統檔案的大小,一般為2GB。
9.mysql中varchar與char的區別以及varchar(50)中的50代表的涵義?
- varchar與char的區別: char是一種固定長度的型別,varchar則是一種可變長度的型別.
- varchar(50)中50的涵義 : 最多存放50個位元組
- int(20)中20的涵義: int(M)中的M indicates the maximum display width (最大顯示寬度)for integer types. The maximum legal display width is 255.
10.MySQL中InnoDB支援的四種事務隔離級別名稱,以及逐級之間的區別?
- Read Uncommitted(讀取未提交內容) >> 在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,因為它的效能也不比其他級別好多少。讀取未提交的資料,也被稱之為髒讀(Dirty Read)。
- Read Committed(讀取提交內容) >> 這是大多數資料庫系統的預設隔離級別(但不是MySQL預設的)。它滿足了隔離的簡單定義:一個事務只能看見已經提交事務所做的改變。這種隔離級別也支援所謂的不可重複讀(Nonrepeatable Read),因為同一事務的其他例項在該例項處理其間可能會有新的commit,所以同一select可能返回不同結果。
- Repeatable Read(可重讀) >> 這是MySQL的預設事務隔離級別,它確保同一事務的多個例項在併發讀取資料時,會看到同樣的資料行。不過理論上,這會導致另一個棘手的問題:幻讀(Phantom Read)。簡單的說,幻讀指當使用者讀取某一範圍的資料行時,另一個事務又在該範圍內插入了新行,當使用者再讀取該範圍的資料行時,會發現有新的“幻影” 行。InnoDB和Falcon儲存引擎通過多版本併發控制(MVCC,Multiversion Concurrency Control 間隙鎖)機制解決了該問題。注:其實多版本只是解決不可重複讀問題,而加上間隙鎖(也就是它這裡所謂的併發控制)才解決了幻讀問題。
- Serializable(可序列化) >> 這是最高的隔離級別,它通過強制事務排序,使之不可能相互衝突,從而解決幻讀問題。簡言之,它是在每個讀的資料行上加上共享鎖。在這個級別,可能導致大量的超時現象和鎖競爭。
隔離級別 髒讀(Dirty Read) 不可重複讀(NonRepeatable Read) 幻讀(Phantom Read) 未提交讀(Read uncommitted) 可能 可能 可能 已提交讀(Read committed) 不可能 可能 可能 可重複讀(Repeatable read) 不可能 不可能 可能 可序列化(SERIALIZABLE) 不可能 不可能 不可能
11.表中有大欄位X(例如:text型別),且欄位X不會經常更新,以讀為為主,將該欄位拆成子表好處是什麼?
如果欄位裡面有大欄位(text,blob)型別的,而且這些欄位的訪問並不多,這時候放在一起就變成缺點了。 MYSQL資料庫的記錄儲存是按行儲存的,資料塊大小又是固定的(16K),每條記錄越小,相同的塊儲存的記錄就越多。此時應該把大欄位拆走,這樣應付大部分小欄位的查詢時,就能提高效率。當需要查詢大欄位時,此時的關聯查詢是不可避免的,但也是值得的。拆分開後,對欄位的UPDAE就要UPDATE多個表了
12.MySQL中InnoDB引擎的行鎖是通過加在什麼上完成(或稱實現)的?
InnoDB行鎖是通過給索引上的索引項加鎖來實現的,這一點MySQL與Oracle不同,後者是通過在資料塊中對相應資料行加鎖來實現的。InnoDB這種行鎖實現特點意味著:只有通過索引條件檢索資料,InnoDB才使用行級鎖,否則,InnoDB將使用表鎖!
13.若一張表中只有一個欄位VARCHAR(N)型別,utf8編碼,則N最大值為多少(精確到數量級即可)?
由於utf8的每個字元最多佔用3個位元組。而MySQL定義行的長度不能超過65535,因此N的最大值計算方法為:(65535-1-2)/3。減去1的原因是實際儲存從第二個位元組開始,減去2的原因是因為要在列表長度儲存實際的字元長度,除以3是因為utf8限制:每個字元最多佔用3個位元組。
14. [SELECT *] 和[SELECT 全部欄位]的2種寫法有何優缺點?
- 前者要解析資料字典,後者不需要
- 結果輸出順序,前者與建表列順序相同,後者按指定欄位順序。
- 表欄位改名,前者不需要修改,後者需要改
- 後者可以建立索引進行優化,前者無法優化
- 後者的可讀性比前者要高
15.HAVNG 子句 和 WHERE的異同點?
- 語法上:where 用表中列名,having用select結果別名
- 影響結果範圍:where從表讀出資料的行數,having返回客戶端的行數
- 索引:where 可以使用索引,having不能使用索引,只能在臨時結果集操作
- where後面不能使用聚集函式,having是專門使用聚集函式的。
最後:
針對最近很多人都在面試,我這邊也整理了相當多的面試專題資料,也有其他大廠的面經。希望可以幫助到大家。
下面的面試題答案都整理成文件筆記。也還整理了一些面試資料&最新2020收集的一些大廠的面試真題(都整理成文件,小部分截圖),有需要的可以點選進入暗號CSDN
相關文章
- 面試官出的MySQL索引問題,這篇文章全給你解決!面試MySql索引
- MySQL 高頻面試題,都在這了MySql面試題
- 很用心的為你寫了 9 道 MySQL 面試題MySql面試題
- 這些javascript面試題,你做對了幾道?JavaScript面試題
- mysql一道面試題MySql面試題
- 征服面試官:OkHttp 原理篇 掌握這篇面試題彙總,吊打面試官!HTTP面試題
- 看完這篇 HashSet,跟面試官扯皮沒問題了面試
- 100道Java高頻面試題(阿里面試官整理)Java面試題阿里
- 聽我的,看完這30道MySQL基礎題再去面試MySql面試
- 面試 HTTP ,99% 的面試官都愛問這些問題面試HTTP
- 求助,這幾道面試題有些我回答不出來了面試題
- 面試官:MySQL的幻讀是怎麼被解決的?面試MySql
- 看完這篇HTTP,跟面試官扯皮就沒問題了HTTP面試
- 一道面試題:大家幫忙解決面試題
- 又面試了Python爬蟲工程師,碰到這麼幾道面試題,Python面試題No9Python爬蟲工程師面試題
- MyBatis面試題集合,90%會遇到這些問題MyBatis面試題
- 詢問面試官的面試問題面試
- 熟悉這幾道 Redis 高頻面試題,面試不用愁Redis面試題
- 想要面試BATJ,先做完這160道Java面試題~BATJava面試題
- 2019年面試官最喜歡問的28道ZooKeeper面試題面試題
- 面試官一道題就把你刷下?21道大廠高階面試題,助力金三銀四!面試題
- 想要去BATJ面試的話,先做完這160道Java面試題...BATJava面試題
- 面試寶典:15道MyBatis 常見面試題彙總及答案MyBatis面試題
- 面試必刷:最有用的Mysql面試題,面試了無數公司總結的MySql面試題
- MySQL精選60道面試題 ( 含答案 )MySql面試題
- 刷完500道BAT面試題,我能去面試大廠了嗎?BAT面試題
- 每日三道面試題,通往自由的道路14——MySQL面試題MySql
- 面試官:你都工作3年了,這個演算法題都不會?面試演算法
- 面試命中率90%的點 —— MySQL鎖面試MySql
- 2019年Spring Boot面試都問了什麼?快看看這22道面試題!Spring Boot面試題
- 這是道面試題,想不懂,請教大家面試題
- 面試珍藏:最常見的20道Java面試題Java面試題
- 面試官:MySQL 有哪些鎖??面試MySql
- 這幾道Java集合框架面試題在面試中幾乎必問Java框架面試題
- Java併發程式設計40道面試題及答案——面試穩了Java程式設計面試題
- 今天BOSS約了個面試,HR直接發我一道面試題面試題
- 被面試官溫柔地掛掉面試?決定面試成敗的這些“暗示”你讀懂了嗎?面試
- 求職時這樣回答問題你就輸了!來自IT類面試官視角的深度解讀求職面試