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...