01. 基礎架構:一條SQL查詢語句是如何執行的?
MySQL 的邏輯架構圖
02. 日志系統:一條SQL更新語句是如何執行的?
之前你可能經常聽DBA同事說,MySQL可以恢復到半個月內任意一秒的狀態,驚嘆的同時,你是不是心中也會不免會好奇,這是怎樣做到的呢?
03. 事務隔離:為什么你改了我還看不見?
提到事務,你肯定不陌生,和數據庫打交道的時候,我們總是會用到事務。最經典的例子就是轉賬,你要給朋友小王轉100塊錢,而此時你的銀行卡只有100塊錢。
轉賬過程具體到程序里會有一系列的操作,比如查詢余額、做加減法、更新余額等,這些操作必須保證是一體的,不然等程序查完之后,還沒做減法之前,你這100塊錢,完全可以借著這個時間差再查一次,然后再給另外一個朋友轉賬,如果銀行這么整,不就亂了么?這時就要用到“事務”這個概念了。
說說索引(上)
提到數據庫索引,我想你并不陌生,在日常工作中會經常接觸到。比如某一個 SQL 查詢比較慢,分析完原因之后,你可能就會說“給某個字段加個索引吧”之類的解決方案。但到底什么是索引,索引又是如何工作的呢?
說說索引(下)
06. 全局鎖和表鎖 :給表加個字段怎么有這么多阻礙?
數據庫鎖設計的初衷是處理并發問題。作為多用戶共享的資源,當出現并發訪問的時候,數據庫需要合理地控制資源的訪問規則。而鎖就是用來實現這些訪問規則的重要數據結構。
07. 行鎖功過:怎么減少行鎖對性能的影響?
MySQL 的行鎖是在引擎層由各個引擎自己實現的。但并不是所有的引擎都支持行鎖,比如MyISAM引擎就不支持行鎖。不支持行鎖意味著并發控制只能使用表鎖,對于這種引擎的表,同一張表上任何時刻只能有一個更新在執行,這就會影響到業務并發度。InnoDB是支持行鎖的,這也是 MyISAM 被 InnoDB 替代的重要原因之一。
08. 事務到底是隔離的還是不隔離的?
09. 普通索引和唯一索引,應該怎么選擇?
10. MySQL為什么有時候會選錯索引?
不知道你有沒有碰到過這種情況,一條本來可以執行得很快的語句,卻由于MySQL選錯了索引,而導致執行速度變得很慢?
11. 怎么給字符串字段加索引?
現在,幾乎所有的系統都支持郵箱登錄,如何在郵箱這樣的字段上建立合理的索引,是要討論的問題。
12. 為什么你的MySQL會“抖”一下?
平時的工作中,不知道你有沒有遇到過這樣的場景,一條 SQL 語句,正常執行的時候特別快,但是有時也不知道怎么回事,它就會變得特別慢,并且這樣的場景很難復現,它不只隨機,而且持續時間還很短。看上去,這就像是數據庫“抖”了一下。今天,我們就一起來看一看這是什么原因。
13. 為什么表數據刪掉一半,表文件大小不變?
我的數據庫占用空間太大,我把一個最大的表刪掉了一半的數據,怎么表文件的大小還是沒變?
14. count(*)這么慢,你該怎么辦?
在開發系統的時候,你可能經常需要計算一個表的行數,比如一個交易系統的所有變更記錄總數。這時候你可能會想,一條select count(*) from t 語句不就解決了嗎?
但是,你會發現隨著系統中記錄數越來越多,這條語句執行得也會越來越慢。然后你可能就想了,MySQL 怎么這么笨啊,記個總數,每次要查的時候直接讀出來,不就好了嗎。
15. 日志和索引相關問題
兩階段提交示意圖
16. “order by”是怎么工作的?
17. 如何正確地顯示隨機消息?
18. 為什么這些SQL語句邏輯相同,性能卻差異巨大?
在 MySQL 中,有很多看上去邏輯相同,但性能卻差異巨大的 SQL 語句。對這些語句使用不當的話,就會不經意間導致整個數據庫的壓力變大。
我今天挑選了三個這樣的案例和你分享。希望再遇到相似的問題時,你可以做到舉一反三、快速解決問題。
19. 為什么我只查一行的語句,也執行這么慢?
20. 幻讀是什么,幻讀有什么問題?
21. 為什么只改一行的語句,鎖這么多?
22. MySQL有哪些“飲鴆止渴”提高性能的方法?
不知道你在實際運維過程中有沒有碰到這樣的情景:業務高峰期,生產環境的 MySQL 壓力太大,沒法正常響應,需要短期內、臨時性地提升一些性能。
23. MySQL是怎么保證數據不丟的?
24. MySQL是怎么保證主備一致的?
大家知道 binlog 可以用來歸檔,也可以用來做主備同步,但它的內容是什么樣的呢?為什么備庫執行了 binlog 就可以跟主庫保持一致了呢?咱們就好好嘮嘮這個問題。
25. MySQL是怎么保證高可用的?
最后
為什么我不完全主張自學?
①平臺上的大牛基本上都有很多年的工作經驗了,你有沒有想過之前行業的門檻是什么樣的,現在行業門檻是什么樣的?以前企業對于程序員能力要求沒有這么高,甚至十多年前你只要會寫個“Hello World”,你都可以入門這個行業,所以以前要入門是完全可以入門的。
②現在也有一些優秀的年輕大牛,他們或許也是自學成才,但是他們一定是具備優秀的學習能力,優秀的自我管理能力(時間管理,靜心堅持等方面)以及善于發現問題并總結問題。
如果說你認為你的目標十分明確,能做到第②點所說的幾個點,以目前的市場來看,你才真正的適合去自學。
除此之外,對于絕大部分人來說,報班一定是最好的一種快速成長的方式。但是有個問題,現在市場上的培訓機構質量參差不齊,如果你沒有找準一個好的培訓班,完全是浪費精力,時間以及金錢,這個需要自己去甄別選擇。
我個人建議線上比線下的性價比更高,線下培訓價格基本上沒2W是下不來的,線上教育現在比較成熟了,此次疫情期間,學生基本上都感受過線上的學習模式。相比線下而言,線上的優勢以我的了解主要是以下幾個方面:
①價格:線上的價格基本上是線下的一半;
②老師:相對而言線上教育的師資力量比線下更強大也更加豐富,資源更好協調;
③時間:學習時間相對而言更自由,不用裸辭學習,適合邊學邊工作,降低生活壓力;
④課程:從課程內容來說,確實要比線下講的更加深入。
應該學哪些技術才能達到企業的要求?(下圖總結)
Java全套資料免費領取方式:戳這里
要求?(下圖總結)**
Java全套資料免費領取方式:戳這里
[外鏈圖片轉存中…(img-rsG150Ep-1626761721356)]
[外鏈圖片轉存中…(img-Rm5i50C6-1626761721357)]