高性能MySQL筆記,第一章MySQL基礎

MySQL整體架構分爲三層,第一層主要是用來處理連接,核心功能其實就是獲取sql語句,還有一些安全方面的操作,比如登錄,獲取權限等

第一層獲取了sql語句之後就會把sql語句交給第二層,第二層負責將sql語句進行解析和優化,以便讓sql語句的執行效果更好,同時還會查詢sql語句是否已經查詢並留下緩存,如果存在緩存,就直接返回緩存中的東西,而不是實際查詢

第三層是實際執行查詢的地方,就如我們寫Java代碼實際上是調用各種api一樣,MySQL調用各個儲存引擎的接口,傳入sql,獲取結果

在這裏插入圖片描述

MySQL中最核心也是最基本的功能其實是併發控制,想一想,我們爲什麼不用直接在某個文件中直接寫入數據的形式進行操作呢?效率是一方面原因,但還有一個關鍵原因,如果兩個系統同時對這個簡單的文件系統同時進行寫入數據,會發生什麼呢?兩個數據被互相嵌套在一起,這個文件中保存的就不是有意義的一段文字或是其他一些東西,而是變成了一堆亂碼,一堆毫無意義的亂碼,而爲了避免這種情況的發生,加鎖是最簡單而有效的解決方案

但是鎖本身也是不同的,對於鎖來說,可能有不同的用途,需要不同的實現方式,不同的範圍,還需要對特定的數據進行優化,但是終究逃不過兩大分類,讀鎖和寫鎖,而對於讀取來說,其實是可以允許多個鎖共同操作的,因爲讀取並不會改變數據,也就沒有造成錯誤的可能,但是我們仍然是需要讀鎖的,因爲雖然讀取並不改變數據,但是如果讀取的同時進行寫入,讀取的就有可能是錯誤信息了,也就是所謂的髒讀,幻讀或是不可重複讀,在特定的情況下,這可能會導致嚴重的錯誤

鎖的粒度也是需要考慮的,就像篩子,篩子的孔越小,通過的東西(數據),也就越精確,越不容易出錯,但是相應的,需要篩的時間也會變長,MySQL中,有最常見的兩種篩孔,表鎖和行鎖,故名思意,表鎖是鎖定一張表,而行鎖是鎖定一行數據,但還是略有不同,我們可以手動指定表鎖,但是行鎖是儲存引擎自己實現的,我們並不能手動去操作他

事務也是數據庫應對併發的的核心之一,不限於MySQL數據庫,而說到事務就不得不提到一個比較空泛的概念,ACID,即原子性,一致性,隔離性,持久性。爲什麼說他們空泛呢?對於一致性,持久性,基本上就是一個美好的願望
在這裏插入圖片描述
在這裏插入圖片描述
一致性的核心理念是,執行時,其他事務對於數據是不可見的,只能看到開始或結束的狀態,例如,你有三臺服務器,你通過update更新了一條記錄,對於任何時候,這三臺服務器都是一樣的,三臺服務器只有更新的狀態和沒更新的狀態,不存在一臺更新了數據,而其他兩臺沒更新,這叫一致性,而持久性的核心是,只要sql語句執行成功,那麼無論發生什麼,數據庫中都會保存更改
在這裏插入圖片描述
前者只是願望的原因是因爲性能和其他一些原因,一致性是可以被主觀或客觀打破的,例如上面這裏例子,如果最終sql執行成功了,服務器一立即更新,同時告訴服務器二三進行更新,這個時候,是肯定會出現服務器一已經更新完成,而服務器二三剛剛接到執行成功的反饋,總不可能,大家約個時間一起展示吧,就算約個時間一起更新,大家的時間也可能會不同,這就是死循環了

而持久性就更加扯淡了,沒有任何系統能保證百分之百不出問題,系統畢竟是運行在現實生活中,不是獨立存在,火災,停電,意外太多了,所以只能說出問題的概率小到一定程度,就叫持久性,並不是百分之百不出問題

相對來說,原子性和隔離性還是比較靠譜的,原子性要求要麼成功,要麼失敗,所有操作視爲一體,隔離性要求事務的操作對於其他事務是不可見的,也就是說其他事務是不知道自己在操作什麼的,配合一致性的效果就是對於外界來說,事務就是一個黑盒子,是不可見的,而高級別隔離的前提就是一致性,這個並不衝突,當然,隔離級別也可能破壞一致性,比如髒讀

隔離級別一般分爲這麼幾個級別,髒讀,不可重複讀,幻讀,序列化,髒讀就是沒有任何事務隔離,更接近於執行獨立的sql語句,而不可重複讀表示在事務執行的過程中,事務中操作的數據有被修改的可能,也就是說,在同一個事務中,兩次讀取的數據可能不同,幻讀保證了同一個事務中多次讀取的數據完全一致,但是無法避免在執行的過程中其他事務插入數據,造成數據條數不一致,而序列化是最高隔離級別,此時完全拋棄併發,所有事務單線程執行
在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述
髒讀和序列化很好理解,但是不可重複讀和幻讀就沒那麼好理解了,我個人的理解是,當事務執行前,幻讀會先檢查事務中可能會調用的數據,並加上鎖,防止可能會被調用的數據被修改,造成數據不一致,但是並沒有鎖住整張表(鎖住就是序列化),此時其他事務任然可以插入數據,只是不能修改被鎖住的數據,而不可重複讀並沒有鎖這個概念,在操作的過程中其他事務可以隨意操作

MySQL中的事務默認是自動提交,每一條數據都被當成一個事務自動執行,可以使用show VARIABLES LIKE “autocommit”;查看當前是否開啓了自動提交

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章