我有一個程序員朋友, 咱們都叫他回龍觀大叔, 由於他所在公司經營不善, 被動離職。咱們一塊兒聽聽他的故事.mysql
距離上次面試過去兩天了, 但仍未能抹平心靈的創傷, 上次面試問了我幾個mysql問題, 都沒能很好的答上來.程序員
好比:面試
1. mysql B+樹是什麼結構?
2. mysql 事務是怎麼是實現的?
3. 你先回去等通知吧
複製代碼
最後我心都涼了, 質問了面試官幾句, 問這些對工做有啥用? 有真正考察到個人實力嗎? 隨後我就生氣走了.sql
回龍觀某小區出租屋中, 喝着上週剩下的半瓶可樂, 坐在電腦前邊刷微信邊找工做, 吐槽着人生不公與公司的冷漠.數據庫
嗯? juejin 又有活動了? 小冊免費學?
複製代碼
做爲薅羊毛上癮的我來講, 天然也不會錯過這根羊毛, 買個 mysql 小冊吧, 時代變了, 得學點基礎原理應付應付面試了.緩存
將來的面試官若是問我: 客戶端與服務器是怎麼鏈接的呀?服務器
我會先漏出一絲微笑以示尊重, 而後答:微信
mysql有三種鏈接方式, TCP/IP、命名管道和共享內存和Unix域套接字文件, 可是咱們通常都使用的是 TCP/IP 模式的, 由於後面兩個只能客戶端與服務端在同一機器上, 可是做爲核心基礎數據庫, 咱們通常都分開部署的.markdown
指定默認端口 3306, 端口能夠在啓動 mysql 的時候使用 -P 指定, max_connections 指定同時最大鏈接數app
將來面試官確定的點了點頭, 再問我: mysql是怎麼接收請求並處理的
我再答:
mysql處理請求一共分爲三大步驟 鏈接管理、解析與優化、存儲引擎.
順便找面試官要張紙, 我要把總體結構畫出來!!!
面試官你看最上面對外鏈接管理這個框, 一個請求進來, 首先要創建鏈接(TCP三次握手), mysql 會從線程池裏面分配一個線程來處理當前請求
數據庫也確定須要帳號密碼, 須要檢測帳號密碼合法性和權限, 若是鑑權失敗就會返回錯誤信息, 處理線程釋放到池等待下一次請求.
好比面試官你提個問題, 我背這麼多東西, 得想一想是哪塊的知識, 你看這個解析優化就是作這個的. 一個 sql 語句給到 mysql, mysql 得分析下 sql 吧, 定位到具體的表和條件.
有時候別人已經查過了, 就不必再查一次, 查詢緩存模塊就是幹這個用的, 可是緩存在mysql中仍是有些問題, 他是根據傳進來的sql生成的緩存key, sql語句大小寫、隨機函數都會 cache miss, 有嚴重的鎖爭用, 這個在新版本已經被移除掉了.
查詢優化是根據行數、實際查詢進行調整優化, 核心有限過濾大部分數據.
存儲引擎是咱們存儲數據方式的不一樣而使用不一樣的引擎, 通常咱們默認使用 innodb 引擎
建立表能夠指定, 也可使用 default-storage-engine 指定默認引擎
面試官不耐煩的聽完講了上面問題後, 問: mysql的字符集遇到過什麼問題? 不要偏離主題.
我會答:
utf8mb3:閹割過的utf8字符集,只使用1~3個字節表示字符。
utf8mb4:正宗的utf8字符集,使用1~4個字節表示字符。
在MySQL中utf8是utf8mb3的別名,utf8就意味着使用1~3個字節來表示一個字符,若是使用4字節編碼一個字符的狀況,好比存儲一些emoji表情啥的,那請使用utf8mb4, 英文、數字等只使用一個字符便可表示.
字符集和字符編碼區別
字符集和字符編碼的關係,字符集是規範,字符編碼是規範的具體實現;字符集規定了符號和二進制代碼值的惟一對應關係,可是沒有指定具體的存儲方式;unicode、ASCII、GB23十二、GBK都是字符集;其中ASCII、GB23十二、GBK既是字符集也是字符編碼;注意不混淆這二者區別;而unicode的具體實現有UTF-8,UTF-16,UTF-32。
存儲引擎是管理組織咱們數據的地方, 存儲有不少類型, 目前通常主要使用 Innodb, 它的流行並非偶然, 支持事務、行鎖、聚簇索引等都有不少優點, 面試官以後會問的, 我就先不說了.
Innodb 會爲表加一些隱藏列:
列名 | 做用 |
---|---|
DB_ROW_ID | 行ID,惟一標識一條記錄 |
DB_TRX_ID | 事務ID |
DB_ROLL_PTR | 回滾指針 |
InnoDB表對主鍵的生成策略:優先使用用戶自定義主鍵做爲主鍵,若是用戶沒有定義主鍵,則選取一個Unique鍵做爲主鍵,若是表中連Unique鍵都沒有定義的話,則InnoDB會爲表默認添加一個名爲row_id的隱藏列做爲主鍵
Compact格式存儲
一個不定長字符串存儲佔用空間( varchar(xx) )
VARCHAR(M)類型的列最多能夠佔用 65535 個字節, 可是咱們有額外的空間佔用, 最多可存儲 65532 個字符(長度佔用兩個字符、NULL標記佔用1個)
若是指定 NOT NULL, 可以使用 65533 個字節, utf8mb4 最多有4個字節, 最多存儲 16383 個字符(65533/4).
MySQL中磁盤和內存交互的基本單位是頁,也就是說MySQL是以頁爲基本單位來管理存儲空間的,咱們的記錄都會被分配到某個頁中存儲。而一個頁的大小通常是16KB,也就是16384字節, 建議單行記錄不要超過此大小, 不然會發生行溢出, 超出的部分放到其餘頁稱爲頁溢出.
一個頁須要132字節空間記錄信息, 每一個條須要最多 27 字節記錄額外信息, 每page頁最少展現兩行記錄, 因此須要額外減掉
好啦好啦~ 估計面試官會讓我等會兒~ 進入二面.
《(第二回合)回龍觀大叔狂磕mysql》敬請期待~