MySQL相關面試題
1、如何處理Mysql的慢查詢?
(1)開啟慢查詢日誌,準確定位到哪個sql出問題(自定義時間引數)
(2)分析sql語句,看看是否load了額外的資料。可能是查詢了多餘的行,也可能載入了許多結果中不需要的列。
(3)分析語句的執行計劃,檢視索引使用情況,優化索引查詢
(4)若無法對語句優化,考慮表中資料量是否太大,橫向或縱向分表
2、Mysql的隔離級別有哪些?
低級別的隔離一般支援更高的併發處理
讀取未提交內容(髒讀、幻讀、不可重複讀):效率最高,安全最低(幾乎不用)。讀取的資料沒用
讀取已提交內容(不可重複讀,幻讀):一定程度上解決了髒讀問題,產生不可重複讀問題(併發讀取結果不一樣)。效率足夠高
可重複讀(預設,幻讀):解決“不可重複讀”問題,保證同一事務多個例項併發讀取時,會看到相同結果,會產生“幻讀”問題。
可序列化(最高的隔離級別):強行事務排序,不可能相互衝突。每個讀得資料行上加鎖。會導致超時和鎖競爭(很少使用)
問題:
髒讀:讀取的資料並非是最終持久化資料
不可重複度:相同的查詢語句返回不一樣的結果
幻讀:事務非獨立執行時,將所有資料修改後,此時有新的事務完成當前資料的插入,導致並沒有將所有資料修改完。
3、Mysql複製原理是什麼?
主從複製,讀寫分離。
原理:Master主機生成二進位制Log檔案,Slave從機IO 執行緒讀取二進位制Log檔案並寫入Relay Log,Slave sql執行緒
4、mysql聚簇和非聚簇索引的區別是什麼?
MyISam 儲存引擎(表鎖)
.frm 表結構
.MYD 資料檔案
.MYI 索引檔案
INNODB 儲存引擎(行鎖,預設)
.frm 表結構
.ibd 資料和索引檔案(主鍵、唯一鍵、6位元組rowid)
既有聚簇索引,又有非聚簇索引。
聚簇索引:跟資料繫結在一起的索引; 反之,非聚簇索引。
其他索引的葉子節點中儲存的都是聚簇索引的key值
5、索引的基本原理
(1)什麼是索引?
是一種key,是儲存引擎快速找到記錄的一種資料結構。(相當於目錄)
(2)索引的資料結構:B+樹索引、Hash索引
Innodb儲存引擎:B+樹索引
層數越多,資料量指數增長,適合範圍查詢
Memory儲存引擎(記憶體中,斷電丟失):Hash索引
單條記錄查詢快,範圍查詢慢
每個key對應一個value,雜湊方式分佈,不支援範圍查詢和排序;
(3)B+樹實現索引上的優勢及過程
6、mysql鎖的型別
共享鎖(讀)、排它鎖(寫)
行鎖(Innodb)、表鎖(MyISAM)
7、mysql為什麼要主從同步?
讀寫分離
架構擴充套件,多庫儲存,分庫分表,降低磁碟I/O訪問頻率
8、什麼是Mysql的主從複製?
非同步複製實現從主節點複製到多個從節點,實現讀(從機)寫(主機)分離。
9、mysql執行計劃怎麼看?
id:id相同(多表查詢),順序執行;id不同(子查詢),id越大優先順序越高;id有相同有不同,相同當一組,id越大優先越高,其餘順序執行
table:哪個表
type:system - const - 【eq_ref - ref - range - index - all(全表查詢)】
key:實際使用的索引
rows:被索引優化查詢的資料個數
extra: using filesort(消耗大額外排序)、 using temporary(消耗大用到臨時表)、 using index(索引覆蓋)、using where(回表查詢)
10、什麼是MVCC?
多版本併發控制。目的:提高資料庫併發效能,處理讀寫衝突。(不加鎖,非阻塞併發讀)
當前讀(最新資料):讀取保證最新且併發事務不能修改當前記錄,對讀取的記錄進行加鎖。
快照讀(歷史資料):提高資料庫併發的查詢能力,不加鎖非阻塞讀,前提是隔離級別不是序列級別。(序列級別下快照讀會變成當前讀)
mvcc是類似行鎖的一種,避免加鎖,降低開銷,基於多版本,資料不一定是最新版本。
MVCC多版本併發控制指的是維持一個數據的多個版本,使得讀寫操作沒有衝突,快照讀是Mysql為實現MVCC的一個非阻塞讀功能。具體實現由3個隱式欄位undo日誌、read 、view三個元件來實現。
11、事務的基本特徵是什麼?
事務的四大特徵:原子性、一致性、隔離性、永續性
原子性:要不全成功,要不全失敗
一致性:資料儲存的完整性(資料真實有效)。
隔離性:多事務操作互不影響
永續性:磁碟持久化操作。資料改動必須在事務成功結束commit前儲存至硬碟。
12、ACID是靠什麼保證的?
原子性:是是由回滾來保證
一致性:是其他三大特徵的保證
隔離性:是由MVCC(多版本併發控制)來保證
永續性:由redolog來保證。mysql修改資料會在redolog中記錄日誌資料,資料沒有儲存成功,只要日誌儲存成功,資料就不會丟失。
13、索引的設計原則有哪些?
索引佔用磁碟空間,並不是越多越好。
where子句的列或連線子句的列
基數小的表不適合加索引(基數指可能出現的值,累加值最好)
外來鍵的列已經要建立索引
頻繁更新的列不要有索引
大文字、大物件不要建立索引
14、mysql如何做分散式鎖?
建立表,設定主鍵或唯一key,這個key就是要鎖的key,同一個key在mysql表裡只能插入一次,將鎖競爭交給了資料庫,處理同一個key資料庫保證了只有一個節點能插入成功,其他節點都會插入失敗。
其他想要進行插入資料的併發請求必須等第一次請求執行完畢後刪除id為1的資料才能繼續插入,實現分散式鎖功能。