你好,我是勤一,目前是一名后端研發(fā)工程師。我基本上每天都會和 MySQL 打交道,學習和積累了很多關于 MySQL 的知識。
首先,歡迎你來到我的專欄,在這個專欄里我會系統(tǒng)的帶你學習 MySQL ,由淺入深的帶你學習 MySQL 的重點知識,并教會你如何提升 MySQL 的性能等等。那么,你可能會問:為什么我要系統(tǒng)的額學習 MySQL 呢?
為什么我要系統(tǒng)的學習 MySQL ?
MySQL 的簡單使用對我們的日常工作來說,肯定都不會陌生,甚至對于非技術崗的同學,也需要點基礎的 SQL 知識,用來查詢報表數據。但是在大多數的場景下,我們的 SQL 語句不會很復雜。MySQL 優(yōu)化,服務器性能問題,SQL 查詢優(yōu)化等等這些不都是 DBA 應該操心的嗎,跟我好像沒什么關系啊?那我還有必要系統(tǒng)的學一遍 MySQL 嗎?
答案是:有,身為一名開發(fā)工程師,你還真得好好學學 MySQL 這個東西。
我想在日常的開發(fā)中,你一定聽過重構、優(yōu)化等等 "高大上" 的名詞。它們指得是什么呢?從字面意思上看就是代碼的重構和優(yōu)化。那代碼為什么需要優(yōu)化?
一個原因:性能太差。那到底是什么原因在影響代碼的性能呢?簡單來說,是一個叫 IO 的東西,IO 一般有兩種:
- 網絡 IO:它是說代碼中存在網絡調用,耗時的點主要存在于:服務器 (響應、帶寬限制、路由跳轉延遲等等,一般為幾十到幾千毫秒,受環(huán)境的干擾比較大)。
- 磁盤 IO:它是說對磁盤的隨機讀寫,而這里的隨機讀寫通常都是數據庫(例如 MySQL)的讀寫造成的。
而我們所說的優(yōu)化就是針對這兩種 IO 進行優(yōu)化,但是由于網絡 IO 受環(huán)境等不可預測的因素限制,可以做的優(yōu)化比較有限。所以,優(yōu)化的目標就集中在了磁盤 IO 的數據庫讀寫上面。因此,系統(tǒng)的學習 MySQL,掌握高性能的使用與優(yōu)化方法也就理所當然了。
另外,對于做后端的同學來說,你在面試中也已定遇見過 MySQL 相關的題目吧?面試官不會問你 MySQL 的 CRUD 是怎么做的。但是一定會問你:索引是怎么實現的、怎么對慢查詢做優(yōu)化、分庫分表怎么實現等等諸如此類的問題。所以,系統(tǒng)的掌握 MySQL 在面試中尤其重要。
現在你還覺得系統(tǒng)的學一遍 MySQL 沒有必要嗎?
我該怎樣系統(tǒng)的學習 MySQL 呢?
既然要學習 MySQL,那該怎么學?這是一個問題。
多年以前,我剛開始學習 Linux 的時候,腦子里也有這樣的疑問。我想,該怎樣學習 XXX 技術,這是一個所有程序員都繞不過去的經典問題。
怎樣去學習并學好一門技術,你去網上搜一下會發(fā)現一大堆不靠譜的答案??醇夹g視頻?時間有些不夠,大部分已經工作的學員可能并沒有成塊的時間去看視頻學習。看源碼?更不靠譜,怎么看、從哪看、看完之后收獲在哪這一系列問題還是沒有答案。對于 MySQL 也是如此,這 “家伙” 也非常的龐大,用途也非常廣,想要系統(tǒng)的學習掌握談何容易。
我本人學習與使用 MySQL 多年,從 MySQL5.5 到 8.0 都有一定的使用、優(yōu)化經驗,這里我就從我的角度出發(fā),談一談應該怎樣系統(tǒng)的學習 MySQL。我將這個過程分為三個階段:
基礎運用階段:這一階段要去學習 MySQL 的理論知識,例如:常用的數據類型和適用場景、Schema 的設計規(guī)范等等。之后,以理論去指導實踐,簡單的用一用 MySQL,能理解基本的增刪改查、聚合分組概念等等。同時,也要求能夠自行去解決一些簡單的問題,例如:SQL 語法錯誤、鍵沖突等等。
能力提升階段:在能夠熟練的應用之后,可以去看一些進階知識點以及 MySQL 高級特性,例如:事務、鎖并發(fā)、日志系統(tǒng)、索引優(yōu)化等等。聽起來,似乎這一階段都是理論相關的。但是,也是理論指導實踐的最佳詮釋。在學習理論的過程中,你會驚訝的發(fā)現:原來 MySQL 還可以這樣用、我之前的方法太低效了等等意想不到的收獲。此時,你就可以用 “新的知識” 優(yōu)化、重構之前的工作,以提升性能。同時,你的能力也在逐步提升。
總結輸出階段:在工作中,解決各種錯誤、性能問題的同時,一定要注意多做筆記,多做總結。并在這個過程中,將自己懂得的知識點、技巧、優(yōu)化方案等等輸出出去,幫助其他同學共同進步。正所謂,贈人玫瑰,手有余香。
為了能更好的幫助你渡過這三個階段,我準備了這本專欄。我相信你在學習了這本專欄之后會在 MySQL 的道路上越走越遠,并且收獲滿滿!
下面我們一起來看下這本專欄是如何設計的:
本專欄的內容安排
本專欄一共設計了 7 章內容,涵蓋了豐富的知識點,難度由淺入深,適用于不同能力水平的同學。這里,我將對這 7 章內容的安排進行說明。
- MySQL 基礎:涵蓋常用數據類型與使用建議、聚合與分組聚合、條件和系統(tǒng)函數等等知識點,旨在說明常用但是常常被忽略的知識點與技巧
- MySQL 進階:對事務、鎖并發(fā)、死鎖、索引優(yōu)化等等知識點進行講解,旨在提升對 MySQL 的使用技能
- MySQL 高級特性:包含日志系統(tǒng)、視圖、分區(qū)表、存儲過程等等知識點的分析講解,旨在更好的發(fā)揮 MySQL 的潛能
- 應用設計技巧與調優(yōu):對 Binlog、SQL 查詢優(yōu)化、慢查詢優(yōu)化、服務器性能調優(yōu)等等知識點進行講解說明,旨在優(yōu)化使用提升性能
- MySQL 的實現原理:分析說明 MySQL 的系統(tǒng)邏輯架構、SQL 解析 / 查詢優(yōu)化器的實現原理等等,學習這些能夠對 MySQL 的底層與實現有所了解
- 實踐應用:包含兩個系統(tǒng)的數據表完整設計,從業(yè)務思想出發(fā),為解決實際問題設計了高可用的數據表結構,并對服務器及驅動進行合理配置
- 總結與思考:包含總結、展望與思考三個方面,指出了重點內容、繼續(xù)學習的方向指導,并留下了開放性的思考問題
學習之前的建議與提醒
最后,如果你想購買本專欄,你需要知道這些:
- MySQL 的安裝、基本的增刪改查、排序等語法是需要你事先理解掌握的
- 本專欄使用的 MySQL 版本是 5.7.28,使用 InnoDB 存儲引擎。但是,MySQL 各個版本在語法、底層實現上差別不大,故本專欄的知識點適用于 MySQL 的常見版本(5.5、5.6、5.7)
- 對于專欄中留出的思考題,可以留言到問答區(qū),我會回復解答
- 如果專欄中有不正確的地方,歡迎在留言區(qū)指正