每天資訊MySQL高階開發面試題(三)

菜單

MySQL高階開發面試題(三)

MySQL高階開發面試題(三)

MySQL支援的複製型別有哪些?

Statement

:每一條會修改資料的sql都會記錄在binlog中。不需要記錄每一行的變化,減少了binlog日誌量,節約了IO,提高效能。可能導致(主從複製)的結果不一致。

Row

:不記錄sql語句上下文相關資訊,僅儲存哪條記錄被修改。不會出現(主從複製)的結果不一致!所有的執行的語句當記錄到日誌中的時候,都將以每行記錄的修改來記錄,這樣可能會產生大量的日誌內容。

Mixed

:折中處理方案,實際上就是Statement與Row的結合。一般的語句修改使用statment格式儲存binlog,如一些函式,statement無法完成主從複製的操作,則採用row格式儲存binlog。

說一說MySQL複製的原理以及流程

在Slave 伺服器上執行sart slave命令開啟主從複製開關,開始進行主從複製。

此時,Slave伺服器的IO執行緒會透過在master上已經授權的複製使用者許可權請求連線master伺服器,並請求從執行binlog日誌檔案的指定位置(日誌檔名和位置就是在配置主從複製服務時執行change master命令指定的)之後開始傳送binlog日誌內容

Master伺服器接收到來自Slave伺服器的IO執行緒的請求後,二進位制轉儲IO執行緒會根據Slave伺服器的IO執行緒請求的資訊分批讀取指定binlog日誌檔案指定位置之後的binlog日誌資訊,然後返回給Slave端的IO執行緒。返回的資訊中除了binlog日誌內容外,還有在master伺服器端記錄的新的binlog檔名稱,以及在新的binlog中的下一個指定更新位置。

當Slave伺服器的IO執行緒獲取到Master伺服器上IO執行緒傳送的日誌內容、日誌檔案及位置點後,會將binlog日誌內容依次寫到Slave端自身的Relay Log(即中繼日誌)檔案(MySQL-relay-bin。xxx)的最末端,並將新的binlog檔名和位置記錄到master-info檔案中,以便下一次讀取master端新binlog日誌時能告訴Master伺服器從新binlog日誌的指定檔案及位置開始讀取新的binlog日誌內容

Slave伺服器端的SQL執行緒會實時檢測本地Relay Log 中IO執行緒新增的日誌內容,然後及時把Relay LOG 檔案中的內容解析成sql語句,並在自身Slave伺服器上按解析SQL語句的位置順序執行應用這樣sql語句,並在relay-log。info中記錄當前應用中繼日誌的檔名和位置。

說一說你對資料庫正規化的理解

核心點

靈活使用,優先正規化設計,當正規化設計成為系統的效能瓶頸的時候,使用反正規化設計。

第一正規化

定義:屬於第一正規化關係的所有屬性都不可再分,即資料項不可分。

簡單理解:每個列都不可以再拆分。

第二正規化

定義:要求資料庫表中的每個例項或行必須可以被惟一地區分。

簡單理解:不要有部分依賴。該多對多就去做多對多,不要把多對多關係放在一張表

第三正規化

定義:每一個非主屬性既不部分依賴於也不傳遞依賴於業務主鍵,也就是在第二正規化的基礎上消除了非主鍵對主鍵的傳遞依賴。

簡單理解:表關聯有個主鍵就行,不要放除關聯主鍵之外的其他關聯表資料。

反正規化設計

為了效能和讀取效率的考慮而適當的對資料庫設計正規化的要求進行違反。

允許存在少量的冗餘,換句話來說反正規化化就是使用空間來換取時間。

說一說表鎖與行鎖

表鎖

每次操作鎖住整張表。

開銷小(不需要定位到某個元素,只需要定位到表),加鎖快;

不會出現死鎖;

鎖定粒度大,發生鎖衝突的機率最高,併發度最低;

一般用在整表資料遷移的場景。

表鎖操作方式

手動增加表鎖: lock table 表名稱 read(write),表名稱2 read(write);

查看錶上加過的鎖 show open tables;

刪除表鎖 unlock tables;

行鎖

每次操作鎖住一行資料。

開銷大,加鎖慢;

會出現死鎖;

鎖定粒度最小,發生鎖衝突的機率最低,併發度高。

InnoDB與MYISAM的最大不同點:InnoDB支援行級鎖、支援事務

MyISAM在執行查詢語句SELECT前,會自動給涉及的所有表加讀鎖,在執行update、insert、delete操作會自動給涉及的表加寫鎖。

InnoDB在執行查詢語句SELECT時(非序列隔離級別),不會加鎖。但是update、insert、delete操作會加行鎖。

行鎖操作方式

sql後增加for update來實現行鎖。

for update在不走索引的時候會鎖表!但是當要修改或者查詢的資料不存在的時候,不會鎖表,也不會鎖定行!

說一說間隙鎖

間隙鎖,鎖的就是兩個值之間的空隙。

間隙鎖是在可重複讀隔離級別下才會生效。

在普通索引列上,不管是何種查詢,只要加鎖,都會產生間隙鎖,這跟唯一索引不一樣;

在普通索引和唯一索引中,資料間隙的分析,資料行是優先根據普通索引排序,再根據唯一索引排序。

說一說臨鍵鎖

行鎖與間隙鎖的組合,它的封鎖範圍,既包含索引記錄,又包含索引區間。。

這是Innodb在可重複讀提交下為了解決幻讀問題時引入的鎖機制。

說一說讀鎖與寫鎖

讀鎖會阻塞寫,但是不會阻塞讀。而寫鎖則會把讀和寫都阻塞。

什麼是非標準字串型別?

TINYTEXT

TEXT

MEDIUMTEXT

LONGTEXT

說一說MySQL的時間函式

MySQL高階開發面試題(三)

時間函式結果。png

now()(current_timestamp())函式獲得的是語句開始執行時的時間,而sysdate()函式是這個函式執行時候的時間。

CURRENT_DATE:年月日;其他:年月日時分秒

索引列的數量有沒有限制?

有限制

預設16個列!

MySQL的sql語句區分大小寫麼?

不區分,下面一個sql是等價的

SELECT NOW();

select now();

sElEcT nOw();

效能比較:關鍵字大寫>所有語句大寫>所有語句小寫

MySQL高階開發面試題(三)

MySQL高階開發面試題(二)

MySQL高階開發面試題(一)