MySQL是世界上最流行的開放源代碼關系型數(shù)據(jù)庫管理系統(tǒng)。在MySQL的源碼中包含著豐富的知識和技術,此時我們就可以逐個解說它提供的函數(shù)和接口,讓我們能深入理解并使用MySQL。
在MySQL的源碼中我們可以找到很多文件,其中一個很重要的是sql
目錄,這個目錄包含了MySQL中所有操作數(shù)據(jù)的代碼,例如SELECT、INSERT、UPDATE等等。我們可以找到一個非常重要的文件sql_parse.cc
,它是分析SQL語句的主要代碼。
bool mysql_parse(THD *thd, LEX *lex) { DBUG_ENTER("mysql_parse"); /* make lex the current lex for this Thread */ thd->lex = lex; thd->query_length= (uint) ((thd->query_end-thd->query) & MAX_I32); CHECK_STACK(thd->query_length + ROW_COPY_BUFF_LEN); move_commands(&thd->prep_state, &thd->query); switch (lex->sql_command) { case SQLCOM_SELECT: error = execute_select(thd, lex, result); break; case SQLCOM_CREATE_TABLE ... } ... }
在上面的這個函數(shù)中,我們可以看到它首先把輸入的SQL語句傳給了lex
,接著開始對SQL語句進行分析,根據(jù)lex->sql_command
的不同值分別調(diào)用不同的函數(shù)進行執(zhí)行。
另外一個重要的文件就是sql_class.cc
,其中定義了很多操作數(shù)據(jù)的類和操作類的函數(shù)。
int mysql_select(THD *thd, Item ***rref_pointer_array, TABLE_LIST *tables, uint wild_num, List- &fields, ... { TABLE *select_lex_table= select_lex->first_select()->get_table_list() ? select_lex->first_select()->get_table_list() : *tables->table; JOIN *join= tables->join; bool top_level_select= thd_eflags(thd) & OPTION_SELECT_LIMIT; ... Query_arena arena; bool lock_tables_saved= thd->transaction.stmt.is_lock_tables_set(); while (join->prepare(thd, tables, conditions)) { ... if (quick_select) { ... if (ex && ex->send_to_client()) res= ex; } else if (join->exec()) { ... if (ex && ex->send_to_client()) res= ex; } ... } join->cleanup(); ... }
上面這段代碼就是MySQL中用來執(zhí)行SELECT語句的函數(shù)mysql_select
的體部分,它的主要作用就是執(zhí)行SELECT語句,并將SELECT的結果返回給客戶端。
MySQL源碼中還有很多文件和函數(shù)等值得我們?nèi)W習和解說,需要我們認真閱讀源代碼,逐步深入理解。