




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、MySQL源碼分析代碼結(jié)構(gòu)與基本流程Alibaba DBA TeamTopics MySQL基本架構(gòu) 源碼目錄結(jié)構(gòu) 核心類庫(kù)與函數(shù) 主要模塊 數(shù)據(jù)流MySQL基本架構(gòu)基本架構(gòu)MySQL目錄結(jié)構(gòu)目錄結(jié)構(gòu)(1)BUILD: 內(nèi)含在各個(gè)平臺(tái)、各種編譯器下進(jìn)行編譯的腳本。如compile-pentium-debug表示在pentium架構(gòu)上進(jìn)行調(diào)試編譯的腳本。client: 客戶端工具,如mysql,mysqladmin之類。cmd-line-utils: readline,libedit工具。config: 給aclocal使用的配置文件。dbug: 提供一些調(diào)試用的宏定義。Docs: MySQL在
2、不同平臺(tái)下的參考手冊(cè)extra: 提供innochecksum,resolveip等額外的小工具。include: 包含的頭文件libmysql: 庫(kù)文件,生產(chǎn)libmysqlclient.so。libmysql_r: 線程安全的庫(kù)文件,生成libmysqlclient_r.so。libmysqld: 嵌入式MySQL Server庫(kù).libservices: 5.5.0中新加的目錄,實(shí)現(xiàn)了打印功能。MySQL目錄結(jié)構(gòu)目錄結(jié)構(gòu)(2)man: 適合man命令查看的幫助文件。mysql-test: mysqld的測(cè)試工具套件。mysys: 為實(shí)現(xiàn)跨平臺(tái),MySQL自己實(shí)現(xiàn)了一套常用的數(shù)據(jù)結(jié)構(gòu)和算法
3、,如string, hash等。還包含一些底層函數(shù)的跨平臺(tái)封裝,一般以my_開(kāi)頭。netware: 在netware平臺(tái)上進(jìn)行編譯時(shí)需要的工具和庫(kù)。plugin: MySQL 5.1開(kāi)始支持一個(gè)插件式API接口,不需要重啟mysqld即可動(dòng)態(tài)載入插件,FullText就是一個(gè)例子。pstack: GNU異步棧追蹤工具。regex: 正則表達(dá)式實(shí)現(xiàn)(來(lái)自多倫多大學(xué)Henry Spencer大牛的源碼)。scripts: 提供腳本工具,如mysql_install_db/mysqld_safe等。server-tools:server-tools: 包含instance_manager子目錄,負(fù)責(zé)
4、實(shí)例的本地和遠(yuǎn)程管理。MySQL目錄結(jié)構(gòu)目錄結(jié)構(gòu)(3)sql: MySQL Server主要代碼,將會(huì)生成mysqld文件。sql-bench: 一些基準(zhǔn)測(cè)試代碼代碼,主要是Perl程序(雖然后綴是sh)。sql-common: 存放部分服務(wù)器端和客戶端都會(huì)用到的代碼,有些地方的同名文件是這里lin過(guò)去的。storage: 存儲(chǔ)引擎所在目錄。strings: string庫(kù),包含很多字符串處理的函數(shù)。support-files: f示例配置文件及編譯所需的一些工具。tests: 測(cè)試文件所在目錄。unittest: 單元測(cè)試文件。vio: 虛擬io系統(tǒng),是對(duì)network io的封裝,把不同的
5、協(xié)議封裝成統(tǒng)一的IO函數(shù)。win: 在windows平臺(tái)編譯所需的文件和一些說(shuō)明。zlib: zlib算法庫(kù)(GNU)InnoDB目錄結(jié)構(gòu)目錄結(jié)構(gòu)(1)btr: B+樹(shù)的實(shí)現(xiàn)buf: 緩沖池的實(shí)現(xiàn),包括LRU算法,Flush刷新算法等dict: InnoDB內(nèi)存數(shù)據(jù)字典的實(shí)現(xiàn)dyn: InnoDB動(dòng)態(tài)數(shù)組的實(shí)現(xiàn)fil: InnoDB文件數(shù)據(jù)結(jié)構(gòu)以及對(duì)于文件的一些操作fsp: 對(duì)InnoDB物理文件的管理,如頁(yè)/區(qū)/段等(即)ha: 哈希算法的實(shí)現(xiàn)handler: 繼承與MySQL的handler,實(shí)現(xiàn)handler API與Server交互ibuf: 插入緩沖(Insert Buffer)的實(shí)
6、現(xiàn)include: InnoDB所有頭文件都放在這個(gè)目錄,是查找結(jié)構(gòu)定義的最佳地點(diǎn)lock: InnoDB的鎖實(shí)現(xiàn)及三種鎖算法實(shí)現(xiàn)log: 日志緩沖(Log Buffer)和重做日志組(Redo Log)的實(shí)現(xiàn)InnoDB目錄結(jié)構(gòu)目錄結(jié)構(gòu)(2)mem: 輔助緩沖池(Additional Memory Pool)的實(shí)現(xiàn),用來(lái)申請(qǐng)一些內(nèi)部數(shù)據(jù)結(jié)構(gòu)的內(nèi)存mtr: 事務(wù)的底層實(shí)現(xiàn)(日志,緩沖)os: 封裝一些對(duì)于操作系統(tǒng)的操作page: 頁(yè)的實(shí)現(xiàn),研究InnoDB文件結(jié)構(gòu),這個(gè)目錄至關(guān)重要pars: 重載部分MySQL的SQL Parser(有待商榷)que: Query graph,基本上沒(méi)啥用re
7、ad: 讀取游標(biāo)的實(shí)現(xiàn)rem: 行管理操作(比較操作,打印等)row: 對(duì)于各種類型行數(shù)據(jù)操作的實(shí)現(xiàn)srv: InnoDB后臺(tái)線程,啟動(dòng)服務(wù),Master Thread,SQL隊(duì)列等sync: InnoDB互斥變量(Mutex)的實(shí)現(xiàn),基本同步機(jī)制thr: InnoDB封裝的可移植線程庫(kù)InnoDB目錄結(jié)構(gòu)目錄結(jié)構(gòu)(3)trx: 事務(wù)的實(shí)現(xiàn)usr: Session管理ut: 各種通用小工具核心類庫(kù)核心類庫(kù)THD: 線程類Item: Item類(查詢條目,函數(shù),WHERE,ORDER,GROUP,ON子句等)TABLE: 表描述符TABEL_LIST: JOIN操作描述符Field: 列數(shù)據(jù)類型
8、及屬性定義LEX: 語(yǔ)法樹(shù)Protocol: 通訊協(xié)議NET: 網(wǎng)絡(luò)描述符handler: 存儲(chǔ)引擎接口核心函數(shù)庫(kù)核心函數(shù)庫(kù)(1)內(nèi)存操作內(nèi)存操作:init_alloc_root: 內(nèi)存池初始化,生成內(nèi)存池根(MEM_ROOT)alloc_root: 申請(qǐng)內(nèi)存池內(nèi)存,從mem_root制定的內(nèi)存池申請(qǐng)內(nèi)存塊free_root: 釋放內(nèi)存池,通過(guò)MyFlags指定哪種內(nèi)存可以被釋放文件操作文件操作:my_open: 打開(kāi)一個(gè)文件my_close: 關(guān)閉一個(gè)文件my_b_flush_io_cache: 講數(shù)據(jù)從內(nèi)存緩沖寫(xiě)到物理磁盤(pán)end_io_cache: 釋放一個(gè)IO_CACHE對(duì)象哈希操作哈希
9、操作:_hash_init: 初始化HASH描述符hash_search: 搜索哈希表,調(diào)用hash_firsthash_first: 返回哈希表中找到的第一個(gè)行指針,否則返回0核心函數(shù)庫(kù)核心函數(shù)庫(kù)(2)字符串操作字符串操作:strappend:填充字符串strmov: 移動(dòng)字符串到新地址核心算法核心算法Bitmaps bitmap_init/bimap_free: 創(chuàng)建與釋放一個(gè)位圖 (8*n個(gè)位為單位)bitmap_set_bit/bitmap_fast_test_and_set: 設(shè)置位圖的一個(gè)位bitmap_clear_all/bitmap_set_all: 清空或全部設(shè)置一個(gè)位圖bi
10、tmap_cmp: 對(duì)兩個(gè)位圖的特定位比較Join Buffer如果存在條件過(guò)濾,則第一次過(guò)濾完的記錄將放入Join Buffer,避免第二次再判斷Sort Buffer算法一: 將排序字段和主鍵放入Sort Buffer排序,按照結(jié)果用主鍵取出數(shù)據(jù)返回算法二: 將整行數(shù)據(jù)放入Sort Buffer,排序完成后直接從Sort Buffer返回?cái)?shù)據(jù)MySQLMySQL數(shù)據(jù)流數(shù)據(jù)流MySQL啟動(dòng)流程啟動(dòng)流程主要代碼在sql/mysqld.cc中,精簡(jiǎn)后的代碼如下:int main(int argc, char *argv) /標(biāo)準(zhǔn)入口函數(shù)MY_INIT(argv0);/調(diào)用mysys/My_ini
11、t.c-my_init(),初始化mysql內(nèi)部的系統(tǒng)庫(kù)logger.init_base(); /初始化日志功能init_common_variables(MYSQL_CONFIG_NAME,argc, argv, load_default_groups) /調(diào)用load_defaults(conf_, groups, &argc, &argv),讀取配置信息user_info = check_user(mysqld_user);/檢測(cè)啟動(dòng)時(shí)的用戶選項(xiàng)set_user(mysqld_user, user_info);/設(shè)置以該用戶運(yùn)行init_server_components
12、();/初始化內(nèi)部的一些組件,如table_cache, query_cache等。network_init();/初始化網(wǎng)絡(luò)模塊,創(chuàng)建socket監(jiān)聽(tīng)start_signal_handler();/ 創(chuàng)建pid文件mysql_rm_tmp_tables() | acl_init(opt_noacl)/刪除tmp_table并初始化數(shù)據(jù)庫(kù)級(jí)別的權(quán)限。init_status_vars(); / 初始化mysql中的status變量start_handle_manager();/創(chuàng)建manager線程handle_connections_sockets();/主要處理函數(shù),處理新的連接并創(chuàng)建新的線
13、程處理MySQL監(jiān)聽(tīng)連接監(jiān)聽(tīng)連接主要代碼在sql/mysqld.cc中(handle_connections_sockets),精簡(jiǎn)后的代碼如下:pthread_handler_t handle_connections_sockets(void *arg _attribute_(unused) FD_SET(unix_sock,&clientFDs); / unix_socket在network_init中被打開(kāi) while (!abort_loop) / abort_loop是全局變量,在某些情況下被置為1表示要退出。 readFDs=clientFDs; / 需要監(jiān)聽(tīng)的socket
14、 select(int) max_used_connection,&readFDs,0,0,0); / select異步(?科學(xué)家解釋下是同步還是異步)監(jiān)聽(tīng),當(dāng)接收到?以后返回。 new_sock = accept(sock, my_reinterpret_cast(struct sockaddr *) (&cAddr), &length); / 接受請(qǐng)求 thd= new THD; / 創(chuàng)建mysqld任務(wù)線程描述符,它封裝了一個(gè)客戶端連接請(qǐng)求的所有信息 vio_tmp=vio_new(new_sock, VIO_TYPE_SOCKET, VIO_LOCALHOST)
15、; / 網(wǎng)絡(luò)操作抽象層 my_net_init(&thd-net,vio_tmp); / 初始化任務(wù)線程描述符的網(wǎng)絡(luò)操作 create_new_thread(thd); / 創(chuàng)建任務(wù)線程 MySQL創(chuàng)建連接創(chuàng)建連接(1)主要代碼在sql/mysqld.cc中(create_new_thread/create_thread_to_handle_connection),精簡(jiǎn)后的代碼如下:static void create_new_thread(THD *thd) NET *net=&thd-net; if (connection_count = max_connections +
16、 1 | abort_loop) / 看看當(dāng)前連接數(shù)是不是超過(guò)了系統(tǒng)配置允許的最大值,如果是就斷開(kāi)連接。 close_connection(thd, ER_CON_COUNT_ERROR, 1); delete thd; +connection_count; thread_scheduler.add_connection(thd); / 將新連接加入到thread_scheduler的連接隊(duì)列中。MySQL創(chuàng)建連接創(chuàng)建連接(2)而thread_scheduler轉(zhuǎn)而調(diào)用create_thread_to_handle_connection,精簡(jiǎn)后的代碼如下:void create_thread_
17、to_handle_connection(THD *thd) if (cached_thread_count wake_thread) /看當(dāng)前工作線程緩存(thread_cache)中有否空余的線程 thread_cache.append(thd); pthread_cond_signal(&COND_thread_cache); / 有的話則喚醒一個(gè)線程來(lái)用 else threads.append(thd); pthread_create(&thd-real_id,&connection_attrib, handle_one_connection, (void*)
18、thd); /沒(méi)有可用空閑線程則創(chuàng)建一個(gè)新的線程 MySQL創(chuàng)建連接創(chuàng)建連接(3)創(chuàng)建連接使用handle_one_connection函數(shù),精簡(jiǎn)代碼如下:pthread_handler_t handle_one_connection(void *arg) thread_scheduler.init_new_connection_thread(); / 初始化線程預(yù)處理操作 setup_connection_thread_globals(thd); /載入一些Session級(jí)變量 for (;) lex_start(thd); /初始化LEX詞法解析器 login_connection(thd
19、); / 進(jìn)行連接身份驗(yàn)證 prepare_new_connection_state(thd); / 初始化線程Status,即show status看到的 do_command(thd); / 處理命令 end_connection(thd); /沒(méi)事做了關(guān)閉連接,丟入線程池 MySQL執(zhí)行執(zhí)行Query(1)do_command函數(shù)在sql/sql_parse.cc定義,代碼如下:bool do_command(THD *thd) NET *net= &thd-net; packet_length = my_net_read(net); packet = (char*) net-r
20、ead_pos; command = (enum enum_server_command) (uchar) packet0; / 解析客戶端傳過(guò)來(lái)的命令類型 dispatch_command(command, thd, packet+1, (uint) (packet_length-1);MySQL執(zhí)行執(zhí)行Query(2)再看dispatch_command函數(shù)在sql/sql_parse.cc定義,精簡(jiǎn)代碼如下:bool dispatch_command(enum enum_server_command command, THD *thd, char* packet, uint packet
21、_length) NET *net = &thd-net; thd-command = command; switch (command) /判斷命令類型 case COM_INIT_DB: .; case COM_TABLE_DUMP: .; case COM_CHANGE_USER: .; . case COM_QUERY: /如果是Query alloc_query(thd, packet, packet_length); /從網(wǎng)絡(luò)數(shù)據(jù)包中讀取Query并存入thd-query mysql_parse(thd, thd-query, thd-query_length, &
22、end_of_stmt); /送去解析 MySQL執(zhí)行執(zhí)行Query(3)mysql_parse函數(shù)負(fù)責(zé)解析SQL(sql/sql_parse.cc),精簡(jiǎn)代碼如下:void mysql_parse(THD *thd, const char *inBuf, uint length, const char * found_semicolon) lex_start(thd); /初始化線程解析描述符 if (query_cache_send_result_to_client(thd, (char*) inBuf, length) lex; / 解析過(guò)后的SQL語(yǔ)句的語(yǔ)法結(jié)構(gòu) TABLE_LIST
23、*all_tables = lex-query_tables; / 該語(yǔ)句要訪問(wèn)的表的列表 switch (lex-sql_command) . case SQLCOM_INSERT: insert_precheck(thd, all_tables); mysql_insert(thd, all_tables, lex-field_list, lex-many_values, lex-update_list, lex-value_list, lex-duplicates, lex-ignore); break; . case SQLCOM_SELECT: check_table_access(thd, lex-exchange ? SELECT_ACL | : SELECT_ACL, all_tables, UINT_MAX, FALSE); / 檢查用戶對(duì)數(shù)據(jù)表的訪問(wèn)權(quán)限 execute_sqlcom_select(thd, all_tables); / 執(zhí)行select語(yǔ)句 break; MySQL執(zhí)行執(zhí)行Query(5)我們看一個(gè)例子, mysql_insert (在sql/sql_insert.cc),精簡(jiǎn)代碼如下:bo
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 山西省運(yùn)城市重點(diǎn)中學(xué)2024-2025學(xué)年高三下學(xué)期單元檢測(cè)試題物理試題含解析
- 山西能源學(xué)院《建筑環(huán)境交互原理》2023-2024學(xué)年第一學(xué)期期末試卷
- 吉林省四平市公主嶺市第五高級(jí)中學(xué)2024-2025學(xué)年高中畢業(yè)班第一次診斷性檢測(cè)試題語(yǔ)文試題含解析
- 上海市浦東新區(qū)第一教育署市級(jí)名校2025屆初三3月中考適應(yīng)性調(diào)研考試數(shù)學(xué)試題試卷含解析
- 2025年藥劑師資格考試試卷及答案
- 2025年體育教師招聘考試真題及答案
- 遼寧生態(tài)工程職業(yè)學(xué)院《熔焊原理》2023-2024學(xué)年第二學(xué)期期末試卷
- 2025年土木工程施工管理考試試卷及答案
- 景德鎮(zhèn)陶瓷大學(xué)《運(yùn)動(dòng)心理學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 吉林省前郭爾羅斯蒙古族自治縣重點(diǎn)中學(xué)2025年初三仿真模擬(二)生物試題試卷含解析
- 《危險(xiǎn)化學(xué)品企業(yè)安全生產(chǎn)標(biāo)準(zhǔn)化規(guī)范》專業(yè)深度解讀與應(yīng)用培訓(xùn)指導(dǎo)材料之3:5管理要求-5.2 安全生產(chǎn)責(zé)任制(雷澤佳編制-2025A0)
- 2025年鄉(xiāng)村醫(yī)生基礎(chǔ)醫(yī)學(xué)知識(shí)歷年真題解析及試題
- 2025年體育產(chǎn)業(yè)信息化管理計(jì)劃
- 2024年內(nèi)蒙古建投國(guó)電準(zhǔn)格爾旗能源有限公司招聘考試真題
- 云南省煙草專賣(mài)局(公司)2025年上半年高校畢業(yè)生招聘(第二批)易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 陜西、山西省天一大聯(lián)考2024-2025學(xué)年高中畢業(yè)班階段性測(cè)試(七)英語(yǔ)試題及答案
- 2025年企業(yè)安全生產(chǎn)知識(shí)競(jìng)賽全套復(fù)習(xí)題庫(kù)及答案(完整版)
- 酒店培訓(xùn)技巧
- 車(chē)內(nèi)日常衛(wèi)生管理制度
- 客運(yùn)資格考試題及答案
- 2025年建投國(guó)電準(zhǔn)格爾旗能源有限公司招聘筆試參考題庫(kù)含答案解析
評(píng)論
0/150
提交評(píng)論