MySQL原始碼分析以及目錄結構

2021-07-23 12:57:46 字數 3909 閱讀 2864

主要模組及資料流

經過多年的發展,mysql的主要模組已經穩定,基本不會有大的修改。本文將對mysql的整體架構及重要目錄進行講述。

原始碼結構(mysql-5.5.0-m2)

主要資料結構

主要呼叫流程

mysql啟動

主要**在sql/mysqld.cc中,精簡後的**如下:

int main(int argc, char **argv) //標準入口函式

my_init(argv[0]); //呼叫mysys/my_init.c->my_init(),初始化mysql內部的系統庫

logger.init_base(); //初始化日誌功能

init_common_variables(mysql_config_name,argc, argv, load_default_groups) //呼叫load_defaults(conf_file_name, groups, &argc, &argv),讀取配置資訊

user_info= check_user(mysqld_user);//檢測啟動時的使用者選項

set_user(mysqld_user, user_info);//設定以該使用者執行

init_server_components();//初始化內部的一些元件,如table_cache, query_cache等。

network_init();//初始化網路模組,建立socket監聽

start_signal_handler();// 建立pid檔案

mysql_rm_tmp_tables() || acl_init(opt_noacl)//刪除tmp_table並初始化資料庫級別的許可權。

init_status_vars(); // 初始化mysql中的status變數

start_handle_manager();//建立manager執行緒

handle_connections_sockets();//主要處理函式,處理新的連線並建立新的執行緒處理之

監聽接收鏈結

主要**在sql/mysqld.cc中,精簡後的**如下:

thd *thd;

fd_set(ip_sock,&clientfds); //客戶端socket

while (!abort_loop)

readfds=clientfds;

if (select((int) max_used_connection,&readfds,0,0,0) error && net->vio != 0 &&

!(thd->killed == thd::kill_connection))

end_connection(thd);

}預處理連線

thread_count++;//增加當前連線的執行緒

thread_scheduler.add_connection(thd);

for (;;)

end_connection(thd);

} 處理

do_command在sql/sql_parse.cc中:讀取客戶端傳遞的命令並分發。

net *net= &thd->net;

packet_length= my_net_read(net);

packet= (char*) net->read_pos;

command= (enum enum_server_command) (uchar) packet[0]; //從net結構中獲取命令

dispatch_command(command, thd, packet+1, (uint) (packet_length-1));//分發命令

在dispatch_command函式中,根據命令的型別進行分發。

thd->command=command;

switch( command )

在mysql_parse函式中,

lex_start(thd);

if (query_cache_send_result_to_client(thd, (char*) inbuf, length) sql_command

在mysql_execute_command中,根據命令型別,轉到相應的執行函式。

switch (lex->sql_command) {

lex *lex= thd->lex;

table_list *all_tables;

case sqlcom_select:

check_table_access(thd, lex->exchange ? select_acl | file_acl : select_acl, all_tables, uint_max, false); //檢查使用者許可權

execute_sqlcom_select(thd, all_tables); //執行select命令

break;

case sqlcom_insert:

{ res= insert_precheck(thd, all_tables) //rights

mysql_insert(thd, all_tables, lex->field_list, lex->many_values,

lex->update_list, lex->value_list,

lex->duplicates, lex->ignore);

break;

在execute_sqlcom_select函式中,

res= open_and_lock_tables(thd, all_tables)//directly and indirectly

res= handle_select(thd, lex, result, 0);

handle_select在sql_select.cc中,呼叫mysql_select ,在mysql_select中,

join->prepare();//prepare of whole select (including sub queries in future).

join->optimize();//global select optimisation.

join->exec();//

在mysql_insert函式中,

open_and_lock_tables(thd, table_list)

mysql_prepare_insert(); //prepare item in insert statment

while ((values= its++))

write_record(thd, table ,&info);//寫入新的資料

在write_record函式中,

table->file->ha_write_row(table->record[0])

ha_write_row在handler.cc中,只是乙個介面

write_row(buf); //呼叫表儲存所用的引擎

當客戶端鏈結上mysql服務端時,系統為其分配乙個鏈結描述符thd,用以描述客戶端的所有資訊,將作為引數在各個模組之間傳遞。乙個典型的客戶端查詢在mysql的主要模組之間的呼叫關係如下圖所示:

當mysql啟動完畢後,呼叫handle_connection_sockets等待客戶端連線。當客戶端連線上伺服器時,服務處理函式將接受連 接,會為其建立鏈結執行緒,並進行認證。如認證通過,每個連線線程將會被分配到乙個執行緒描述符thd,可能是新建立的,也可能是從 cached_thread執行緒池中復用的。該描述符包含了客戶端輸入的所有資訊,如查詢語句等。伺服器端會層層解析命令,根據命令型別的不同,轉到相應 的sql執行函式,進而給傳遞給下層的儲存引擎模組,處理磁碟上的資料庫檔案,最後將結果返回。執行完畢後thd將被加入cached_thread中。

MySQL5 5原始碼分析以及目錄結構

主要模組及資料流 經過多年的發展,mysql的主要模組已經穩定,基本不會有大的修改。本文將對mysql的整體架構及重要目錄進行講述。原始碼結構 mysql 5.5.0 m2 主要資料結構 主要呼叫流程 mysql啟動 主要 在sql mysqld.cc中,精簡後的 如下 int main int a...

MySQL查詢優化器原始碼分析 目錄

mysql查詢優化器原始碼分析 基於mysql v6.0.0 alpha,版本號大,但已經滯後於v5.6.x等版本 多表連線優化演算法入口,choose plan 多表連線優化演算法之一,optimize straight join 按表的指定順序求解最優查詢計畫 多表連線優化演算法之二,find ...

MySql原始碼分析

2.請求資料流 原始碼才是王道。1.主函式sql mysqld.cc中,如下 標準入口函式 int main int argc,char ar 2.監聽連線 sql mysqld.cc handle connections sockets pthread handler t handle conne...