思考mysql核心之初級系列3 辦理業務的流程

2021-06-16 04:29:53 字數 2805 閱讀 9873

alex第二天帶了身份到銀行找了小張,要辦理個開戶業務。

1)語法結構lex

alex:「小張,我要開個賬戶。」

小張:「麻煩填寫個開戶申請單。」

alex:「好的,我順便問個問題,開戶要填寫開戶申請單,兌換港幣也要寫申請單,匯款等也需要填寫,這裡面既有共性,又有差異性,是如何管理的。」

小張:「嗯,差不多,都是提供寫一些表單填寫,假設申請建立表,那麼就會用到create_info申請表(資料結構),如下面的**。

create:

create opt_table_options table_sym opt_if_not_exists table_ident

thd *thd= yythd;

lex *lex= thd->lex;

lex->sql_command= sqlcom_create_table;

if (!lex->select_lex.add_table_to_list(thd, $5, null,

tl_option_updating,

tl_write))

mysql_yyabort;

lex->alter_info.reset();

lex->col_list.empty();

lex->change=nulls;

bzero((char*) &lex->create_info,sizeof(lex->create_info));

lex->create_info.options=$2 | $4;

lex->create_info.db_type= ha_default_handlerton(thd);

lex->create_info.default_table_charset= null;

lex->name.str= 0;

lex->name.length= 0;

而某個型別的select需要填寫current_select申請表,select_lex申請表。見下面的**:

select_part2:

lex *lex= lex;

select_lex *sel= lex->current_select;

if (sel->linkage != union_type)

mysql_init_select(lex);

lex->current_select->parsing_place= select_list;

alex:「嗯,差不多。如果alter,insert等字句,也會使用到相應的資料結構,維護了乙個資料結構lex,裡面有各種各樣的字段,根據使用者的請求,會填充相應的字段。當然這裡面也會有共性的內容,比如身份證影印資訊等等。」

小張:「是這樣的,在輸入的語句轉化為lex結構這一塊比較簡單,通過閱讀yy檔案就可以了,但是最好設定斷點除錯一些重要的函式,比如下面的**中,有必要在mysql_init_select函式的實現體設定斷點除錯該函式的功能,該函式的實現體見sql/sql_parse.cpp檔案,同時建議將該檔案中的各個函式看一下。另外強調一下,yy檔案對應的cpp檔案設定斷點預設情況是無效的,需要特殊設定除錯lib,這裡不推薦除錯。掌握yy檔案以及sql_parse.cpp檔案就完全滿足了。這裡不列出每個欄位的含義,建議直接檢視lex的定義檔案,使用的**是5.1.7,檔案為sql/sql_lex.h

select_part2:

lex *lex= lex;

select_lex *sel= lex->current_select;

if (sel->linkage != union_type)

mysql_init_select(lex);

lex->current_select->parsing_place= select_list;

select_options select_item_list

select->parsing_place= no_matter;

select_into select_lock_type

2)thd結構

alex:「好的,那我再繼續深問下,辦理業務的這裡內容給你了,你如果在辦理的過程中,做到有序。」

小張:「好吧,我們現在先假設乙個場景,alex從8樓到1樓辦理招商銀行賬戶開戶,這樣的乙個行為,alex如何執行的,同時假想下資料庫可能是如何執行的。」

alex:「好的,如下表。從表中我們可以看出,alex在執行該操作的過程中需要維護很多資訊,這些資訊資料庫是怎麼維護的呢,比如執行查詢的時候,資料庫表t1正在被其他使用者上了x鎖。

事項alex

資料庫語句

alex從8樓到1樓辦理招商銀行賬戶開戶

select id,name from t1 where id=1

語法分析

通過通過

各種檢查

是否帶了身份證、招商銀行現在是否是辦公時間等等

t1表是否存在,id,name欄位是否存在,是否有查詢許可權等等。

查詢優化

從備選方案裡面選擇:電梯直接下、走樓梯、先坐電梯上去逆行然後達到1樓,……

從備選方案中選擇:全表掃瞄、非聚集索引查詢、聚集所引查詢,……

確定方案

走電梯下去辦理

全表掃瞄

執行獲取電梯這個互斥資源,到達銀行取得號碼排隊,……

取得第一條記錄,判斷是否滿足id=1的條件,如果符合則丟入結果集。對所有的記錄執行一遍。將結果集返回使用者

」小張:「這個問題問得好,確實我們要維護很多資訊。比如開戶的過程中,我們需要維護類似的資訊。在資料庫中是類似的,mysql建立每個執行緒來響應對應的1個客戶的請求。該執行緒維護的這個結構為該程序所獨有,生命週期是執行緒的生命週期。這裡面儲存了重要的客戶的申請資訊lex,鎖資訊等等。具體的字段定義見sql_class.h。」

思考mysql核心之初級系列2

alex取了個號,客戶經理小張負責辦理alex的服務。1 服務清單 小張 先生,我可以為你服務什麼麼?alex 厄,我要一碗紅燒肉。小張 沒有 alex 厄,那來碗拉麵 小張 沒有 alex 那有些啥?小張 可以檢視sql目錄下sql yacc.yy檔案,不過你用的這個5.1.7沒有該檔案,只有相對...

思考mysql核心之初級系列3 辦理業務的流程

alex第二天帶了身份到銀行找了小張,要辦理個開戶業務。1 語法結構lex alex 小張,我要開個賬戶。小張 麻煩填寫個開戶申請單。alex 好的,我順便問個問題,開戶要填寫開戶申請單,兌換港幣也要寫申請單,匯款等也需要填寫,這裡面既有共性,又有差異性,是如何管理的。小張 嗯,差不多,都是提供寫一...

mysql之初級學習(一)

mysql資料庫是一種強型別的語言,數字 nt 整數 最大到10位 float 小數 number 數字 decimal 數字 文字 char 字串 2000 定長 varchar 字串 2000 變長 text 大文字型別 幾萬個字是沒有問題的,野史 官網沒有詳細說明 兩億個字 日期 dateti...