《MySQL是怎樣運作的》讀書筆記
第一次看這本書封面的時候,覺得這本書應該不會講的有多好,因為封面看起來有一些幼稚,但是當我開始讀這本書的時候,我發現是我錯了,這本書講的太好了,由淺入深的平緩學習曲線深深的吸引了我。
在讀第一章的時候,知道了Mysql是個什麼“東西”,是怎麼安裝的,安裝了以後有哪些檔案,有哪些啟動方式,有哪些連接配接方式,有哪些存儲引擎。安裝每個人都會,從知道mysql開始到現在,在windows,linux,macos上,我安裝了mysql大概能有二三十次,但我從來沒有研究過,目錄下到底有哪些檔案(可能就ls的時候掃了一眼),就隻知道mysqld。
MySQL的bin檔案夾中的一些可執行檔案。
1、mysqld 代表 mysql 伺服器程式。運作它就可以直接啟動一個MySQL服務程序。但這個可執行檔案并不常用。(好吧,原來我知道的這個還并不常用)
2、mysqld_safe 是個啟動腳本,會調用 mysqld,順便啟動一個監控程序。
3、mysql.server 也是一個啟動腳本,會間接調用 mysqld_safe。在執行它時,在後面添加start參數就可以啟動伺服器程式了。mysql.server start
4、mysqld_multi 運作多個伺服器執行個體時,可以對每個伺服器程序的啟動和停止進行監控.
MySQL用戶端和伺服器程序在通信時采用的集中方式:
1、 TCP/IP (用的最多的,試想一下是不是經常 mysql -h xxx.xxx.xxx.x,或者在java配置檔案中xxx.xxx.xxx.x:3306)
2、 命名管道或共享記憶體
3、 UNIX域套接字
而MySQL的整個查詢過程大緻分為幾個部分:
1、 連接配接管理:主要負責連接配接的建立與資訊的認證
2、 解析與優化:主要進行查詢緩存、文法解析、查詢優化
3、 存儲引擎:主要負責讀取和寫入底層表的資料。
另外,盡管MySQL有那麼多的存儲引擎,但從MySQL5.5.5版本開始,InnoDB就已經時預設的搜尋引擎了,就可以看出,InnoDB是我們平時用的最多的搜尋引擎。(也的确是這樣,我們平時用它最多)。
在我們平時使用MySQL存儲資料的時候,或多或少會遇到過存emoji表情的時候報錯或者存不進去的情況。這就是MySQL中字元集設定錯了的原因。我們都知道設定成utf8,但其實utf8在MySQL中的另一個名字叫utf8mb3,它是閹割過的UTF-8字元集,隻使用1~3位元組表示字元。是以在需要存emoji表情的時候,需要使用utf8mb4字元集,它才是正宗的UTF-8字元集,使用1~4位元組表示字元。
而在我們平時做模糊查詢的時候,也肯定或多或少的遇到過,模糊查詢‘abc%’的時候,卻怎麼也查不出資料庫中的“ABCD”,這就是MySQL中比較規則設定錯了的原因。隻有在将比較規則設定成utf8_general_ci這種通用的比較規則,才會不區分大小寫。各個規則大緻如下:
1、_ai : 不區分重音
2、_as:區分重音
3、_ci:不區分大小寫
4、_cs:區分大小寫
5、_bin:以二進制的方式比較
第四五章講的是InnoDB的資料存儲,知道了頁是InnoDB中磁盤和記憶體互動的基本機關,也是InnoDB管理存儲空間的基本機關,預設大小為16KB。而InnoDB為了不同的目的設計了不同類型的頁,把用于存放記錄的頁稱為資料頁。
其實整本書最吸引我的地方就是第六七章的B+樹索引,是我既愛又恨的章節。愛是因為這兩章真的講的非常好,讓我學到了很多,恨是因為有點複雜,有的地方看不懂。
InnoDB存儲引擎的索引是一顆B+樹,完整的使用者記錄都存儲在B+樹的第0層的葉子節點,其他層次的節點都屬于内節點,内節點中存儲的是目錄項記錄。
而InnoDB的索引分為兩種。
1、 聚簇索引:以主鍵值的大小作為頁和記錄的排序規則,在葉子節點處存儲的記錄包含了表中的所有列。任何一張有主鍵的表,都有聚簇索,也是最重要的節點,任何一個二級索引的回表操作都需要聚簇索引。
2、 二級索引:這個索引就是使用者自己建立的索引,以索引列的大小作為頁和記錄的排序規則,在葉子節點處存儲的記錄内容是索引列+主鍵。
InnoDB存儲引擎的B+樹根節點在建立之日就不再移動了。
建立索引是為了提高查詢效率,讓汽車變成火箭的,但是,但是,但是,B+樹索引在空間和時間上都要付出代價,是以不能瞎建索引,可能會讓汽車變成單車~而在建立索引的時候,盡可能的讓列資料類型小,因為資料類型越小,索引占用的存儲空間就越小,在一個資料頁内就可能存放更多的記錄,磁盤I/O帶來的性能損耗也就越小,讀寫效率就越高。
除了這些,還有很多值得我去細細揣摩的地方,比如如何優化,事務是怎樣的,redo/undo日志、鎖等等,另外,還沒有選讀這本書的同學們,非常推薦讀一讀這本書,平時用到最多的除了java就是mysql了,這本書是一本值得翻看兩遍、三遍甚至N遍的書,沒有人讀完第一次就能完全掌握的,但是一旦都掌握,那離DBA也就不遠了。