日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

如何阅读mysql源代码_我是如何开始阅读MySQL源码的?

發布時間:2023/12/31 数据库 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何阅读mysql源代码_我是如何开始阅读MySQL源码的? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 為什么要閱讀MySQL源碼?

之前已經看過 高性能MySQL 和 MySQL技術內幕InnoDB存儲引擎, 但總覺得只是看看書上這么說還是不夠.

比如 高性能MySQL 里畫的有B-Tree索引的示意圖,可是B-Tree索引究竟長什么樣子,在MySQL里是怎么存儲的,沒什么概念; 里邊還提到關聯查詢的”泳道圖”,在代碼層面到底是怎么執行的,也不清楚.

2. 從哪兒開始?

直接看MySQL的源碼有點困難.

好在有一本講MySQL的書, 叫 Understanding.MySQL.Internals, 書雖然有點老,但看起來是個不錯的開始.

大概過一下書的內容,發現大部分內容還是看不下去. 只有第4章 Client/Server Communication 還能看.

3. Protocol

Understanding.MySQL.Internals 的第4章 Client/Server Communication 講了MySQL Server和客戶端溝通的協議, 結合著wireshark, 很快就能搞明白.

4. main() -> mysqld_main()

MySQL是由C++寫的,入口函數main()直接調用了mysqld_main().

Server啟動的代碼都在這里,大部分都看不懂.

直到最后的 handle_connections_sockets().

5. handle_connections_sockets()

讀過UNP的看這部分代碼應該都沒問題.

poll()

accept()

thread_scheduler->add_connection()

pthread_create() or thead_cache

handle_one_connection()

for (;;) {

while (connection_alive()) {

do_command();

}

cache_thread();

}

do_command() -> dispatch_command()

6. dispatch_command()

這里已經能夠看到很多熟悉的詞語了,CHANGE_USER,STMT_EXECUTE,STMT_FETCH.

不過最關鍵的執行SQL語句的部分, COM_QUERY, 看不懂.

mysql_parse() -> MYSQLparse()

Understanding.MySQL.Internals 的第9章 Parser and Optimizer, 是講這部分的.

在Parse Tree部分有提到SQL語句最終在 mysql_execute_command() 里執行.

7. mysql_execute_command()

case SQLCOM_CREATE_DB: mysql_create_db();

case SQLCOM_CREATE_TABLE: mysql_create_table();

case SQLCOM_INSERT: mysql_insert();

case SQLCOM_SELECT: execute_sqlcom_select();

mysql_create_db()好理解.

mysql_create_table()里有創建一個.frm文件,要是有文檔說明下.frm文件的格式就好了.

于是就找到了這個 https://dev.mysql.com/doc/internals/en/fileformats.html

從這往篇文檔可以看出, MySQL的歷史真的太久了,官方文檔對很多字段的說明都是always, ??.

看了這個文檔還是搞不明白.frm文件的格式.

8. .MYD and .MYI

由于之前看過InnoDB技術內幕,顯然InnoDB比MyISAM要復雜多了.

MySQL Internals Manual 里邊有一章講MyISAM的,仔細分析了.MYD和.MYI文件的格式,講的挺清楚的.

.MYD的文件格式挺簡單的.

.MYI的就復雜很多了. 對著文檔寫個小程序讀取并解析.MYI文件,有很大幫助.

搞清楚了.MYD和.MYI的文件格式,很多名詞術語也混個臉兒熟了.

回過頭來再看.frm.

9. .frm

創建.frm文件的代碼在 mysql_create_frm() 里.

努力一番后,再寫個小程序讀取并解析下.frm文件,總算搞清楚其格式了.

在創建完.frm后,又調用了Storage Engine的ha_create()方法創建了其它相關的文件,比如MyISAM就創建了.MYD和.MYI文件.

10. plugin_init, mysql_insert, execute_sqlcom_select

這個時間回過頭來再看下啟動代碼里的plugin_init部分,還是相對容易的搞清楚了Stroage Engine是怎么加載的了.

自己編譯一個debug版本的mysqld會有一些幫助.

mysql_insert()還是比較簡單的.

execute_sqlcom_select()就復雜了.

結合著Understanding.MySQL.Internals 的第9章 Parser and Optimizer, 總算看到”泳道圖”是怎么執行的了.

11. 下一步

OK, 萬事開頭難. 到此也算是開了個頭了.

總結

以上是生活随笔為你收集整理的如何阅读mysql源代码_我是如何开始阅读MySQL源码的?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。