国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

探索MySQL源代碼之SQL歷險記

數據庫 MySQL
本文從一個select語句的執行過程出發,遍歷MySQL的多個子系統。按圖索驥開始我們的歷險。

本文從一個select語句的執行過程出發,遍歷MySQL的多個幾子系統。

先放圖一張, 按圖索驥開始我們的歷險.

當客戶端連接上MySQL服務端之后,發出請求之前,服務端的線程是阻塞在do_command(sql/parse.cc)里的my_net_read函數中(就是socket里的read).

當客戶端鍵入sql語句(本文例子select * from zzz)發送到服務端之后, my_net_read返回, 并從tcpbuffer中讀取數據寫入到packet這個字符串.

  1. packet_length= my_net_read(net); 

packet的第一個字節是個標志位, 決定數據包是查詢還是命令,成功,或者出錯。

接下來就進入dispatch_command(sql/sql/parse.cc)這個函數, 數據類型不再需要.

  1. return_value= dispatch_command(command, thd, packet+1, (uint) (packet_length-1)); 

進入dispatch_command, 我們可見

  1. statistic_increment(thd->status_var.questions, &LOCK_status); 

這個就是show status questions的值累加.

接下的mysql_parse(sql/sql_parse.cc), 該函數是sql語句解析的總路口.

進入該函數后首先碰到的是query_cache_send_result_to_client,故名思義這個函數是在QCache里查詢是否有相同的語句, 有則立即從QCache返回結果, 于是整個sql就結束了.

QCache里不存在的sql則繼續前進來到parse_sql(sql/sql_parse.cc),這個函數主要就是調用了MYSQLparse. 而MYSQLparse其實就是bison/yacc里的yyparse(^_^),

  1. #define yyparse MYSQLparse 

是的開始解析sql了. 關于詞法分析和語法匹配簡單說幾下.

對于一條像select * from zzz的語句首先進入詞法分析,找到2個token(select, from), 然后根據token進行語法匹配, 規則在sql/yacc.yy里, 我把幾個匹配到的pattern和action貼出來.

  1. select
  2. select_init 
  3. LEX *lex= Lex; 
  4. lex->sql_command= SQLCOM_SELECT; 
  5. /* Need select_init2 for subselects. */ 
  6. select_init: 
  7. SELECT_SYM select_init2 
  8. '(' select_paren ')' union_opt 
  9. select_paren: 
  10. SELECT_SYM select_part2 
  11. LEX *lex= Lex; 
  12. SELECT_LEX * sel= lex->current_select; 
  13. ..... 
  14. select_from: 
  15. FROM join_table_list where_clause group_clause having_clause 
  16. opt_order_clause opt_limit_clause procedure_clause 
  17. Select->context.table_list= 
  18. Select->context.first_name_resolution_table= 
  19. (TABLE_LIST *) Select->table_list.first
  20. .... 
  21. select_item_list: 
  22. select_item_list ',' select_item 
  23. | select_item 
  24. '*' 
  25. THD *thd= YYTHD; 
  26. Item *item= new (thd->mem_root) 
  27. Item_field(&thd->lex->current_select->context, 
  28. NULLNULL"*"); 
  29. if (item == NULL
  30. MYSQL_YYABORT; 
  31. if (add_item_to_list(thd, item)) 
  32. MYSQL_YYABORT; 
  33. (thd->lex->current_select->with_wild)++; 
  34. select_item: 
  35. remember_name select_item2 remember_end select_alias 
  36. THD *thd= YYTHD; 
  37. DBUG_ASSERT($1 < $3); 
  38. if (add_item_to_list(thd, $2)) 
  39. MYSQL_YYABORT; 
  40. if ($4.str) 
  41. ... 

可以看到action里最關鍵的就是add_item_to_list 和table_list的賦值.

解析后對于需要查詢的表(zzz)和字段(*)這些信息都寫入到thd->lex這個結構體里了.

例如其中thd->lex->query_tables就是表(zzz)的狀況, thd->lex->current_select->with_wild 是表示該語句是否使用了*等等.

  1. (gdb) p *thd->lex->query_tables 
  2.   $7 = {next_local = 0x0, next_global = 0x0, prev_global = 0x855a458, db = 0x85a16b8 "test", alias = 0x85a16e0 "zzz"
  3.   table_name = 0x85a16c0 "zzz", schema_table_name = 0x0, option = 0x0, on_expr = 0x0, prep_on_expr = 0x0, cond_equal = 0x0, 

sql解析完了, 優化呢? 別急接著往下看.

接著進入mysql_execute_command函數,這個函數是所有sql命令的總入口.

由于是這個sql是一個select, 于是execute_sqlcom_select就是我們下個要執行的函數,又然后進入了mysql_select(^_^怒了如此復雜).

mysql_select 就是優化器的模塊, 這個模塊代碼比較復雜. 我們可以清楚看到創建優化器,優化,執行的3個步驟, 優化細節不表.

  1. if (!(join= new JOIN(thd, fields, select_options, result))) 
  2. ... 
  3. if ((err= join->optimize())) 
  4. ... 
  5. join->exec(); 

結束了優化,我們要具體執行join->exec(),該函數實際進入的是JOIN::exec()(sql_select.cc)。

exec()首先向客戶端發送字段title的函數send_fields, 沒數據但字段也是要的。

然后再進入do_select(),根據表的存儲引擎跳入到引擎具體的實現(zzz是myisam表)。

這里mi_scan就是myisam引擎掃描文件的函數,再看到

  1. (gdb) p info->filename 
  2. ./test/zzz 

這不就是zzz表對應的物理文件嗎。

通過一系列的mi函數訪問磁盤拿到數據之后,會通過send_data發送數據給client,并從dispatch_command返回.最后在net_end_statement結束整個sql。

一個簡單的select語句背后的執行過程是非常復雜的,上面的步驟都只是點到就止。

ps: 在sql_yacc.yy可見MySQL對于Oracle中常用的dual表的嘲諷。

【編輯推薦】

  1. 教你如何利用MySQL學習MongoDB
  2. Craigslist采用MongoDB替代MySQL
  3. MySQL中的NoSQL插件
  4. SQL與NoSQL——MySQL與NoSQL的融合
  5. 論MySQL何時使用索引,何時不使用索引
責任編輯:艾婧 來源: ourmysql
相關推薦

2009-10-15 09:21:00

CCNA考試歷險記CCNA

2022-05-05 19:26:17

Druid分布式存儲

2022-05-26 21:38:02

開源分布式Hadoop

2021-02-22 08:20:32

Activity動畫界面

2014-04-01 09:13:23

程序員招聘

2011-01-26 10:05:36

Git安裝配置

2011-03-18 09:35:39

GitLinux版本控制

2011-03-30 10:50:55

GitLinux 版本控制

2011-01-26 09:09:06

版本控制系統GitLinux

2011-02-28 14:37:43

GitLinux版本控制

2017-06-30 17:54:04

2023-02-03 14:24:15

Wine 8.1Windows

2009-02-01 14:39:10

面試網絡工程師英國

2023-10-27 08:34:46

PythonJava優勢

2021-10-18 11:05:51

SQL源代碼AddUpdate

2011-07-06 14:43:41

ASP

2011-07-06 14:46:27

ASP

2018-11-05 14:54:18

MySQLSQL語句數據庫

2016-10-13 19:11:27

JavaScript函數Web

2020-11-13 13:05:27

Java開發代碼
點贊
收藏

51CTO技術棧公眾號

2018国产在线| 在线成人一区| 巨人精品**| 精品三级av在线| 国产午夜电影| 国产福利一区二区三区| 国产主播在线一区| 日本精品国产| 正在播放欧美一区| 亚洲精品88| 精品福利一二区| 国产二区在线播放| 午夜精品福利一区二区三区蜜桃| 九一免费在线观看| 久久久蜜桃一区二区人| 国产三区精品| 日韩区一区二| 中文国产亚洲喷潮| 亚洲一区二区av| 日韩一中文字幕| 国产精品一区二区美女视频免费看 | 午夜精品一区二区三区电影天堂 | 成人不卡免费av| 国内外成人激情免费视频| 日本中文一区二区三区| 伊人再见免费在线观看高清版| 日韩精品一区第一页| 视频一区二区三区免费观看| 麻豆成人av在线| 欧美又粗又长又爽做受| 亚洲欧美一区二区三区极速播放 | 香蕉影视欧美成人| 国产日产一区二区三区| 亚洲成人a级网| 玖玖玖视频精品| 丁香五月网久久综合| 福利一区福利二区| 小泽玛利亚视频在线观看| 夜夜爽夜夜爽精品视频| 亚洲一区精彩视频| 午夜久久tv| 国产精品av免费观看| 亚洲美女偷拍久久| 天堂av中文在线| 欧美精品免费播放| 亚洲另类春色校园小说| 色噜噜狠狠色综合网| 国产精品久久看| 成人免费高清| 国内精品视频久久| 美女诱惑一区二区| 在线成人动漫| 久久久精品亚洲| 日本不卡一区二区三区高清视频| 免费在线观看毛片网站| 4hu四虎永久在线影院成人| 99久久999| 日本精品福利视频| 欧美色精品在线视频| 日韩高清一级| 国产成人久久777777| 亚洲成人性视频| 亚洲一区二区三区| 啊灬啊灬啊灬啊灬高潮在线看| 欧美精品在线看| 国产大片一区二区| 国产伦子伦对白在线播放观看| 99国精产品一二二线| 黑人巨大精品欧美一区免费视频| 中文字幕视频精品一区二区三区| 99精品一级欧美片免费播放| 日韩精品一区二区三区在线播放| 亚洲人metart人体| 国产福利图片| 国产日韩在线看片| 亚洲一区视频在线| 久久偷看各类女兵18女厕嘘嘘| 1024手机看片国产| 日本激情视频网| 亚洲美女福利视频网站| 日韩福利电影在线| 在线观看中文| 欧美高清性xxxxhd| 欧美猛男gaygay网站| 国产精品亚洲综合久久| 欧美色图天堂| 午夜探花在线观看| 国产亚洲精品成人av久久ww| 亚洲一区一卡| 韩国成人免费视频| youjizz.com在线观看| 日韩网站免费观看高清| 国产精品沙发午睡系列990531| 亚洲小说图片视频| a天堂中文在线| 国产精品波多野结衣| 久久69精品久久久久久国产越南| xnxx国产精品| 97精品视频| 激情网站在线| 色综合手机在线| 2020国产精品久久精品不卡| 亚洲精品美女久久| 亚洲精品五月天| 日本不卡视频在线| 视频一区视频二区欧美| 川上优的av在线一区二区| 精品国产一区二区三区在线| 97欧美精品一区二区三区| 色综合久久久网| av在线不卡网| 久久婷婷蜜乳一本欲蜜臀| 伊人色综合一区二区三区影院视频 | 亚洲第一综合天堂另类专| 亚洲日本一区二区三区| 日韩国产在线一| 亚洲精品a级片| 国产精品视屏| 国产高清精品二区| 美女高潮在线观看| 日本中文字幕在线看| 粗大的内捧猛烈进出在线视频| av片在线免费| 亚欧洲精品在线视频免费观看| 国产在线精品成人一区二区三区| 中文字幕日韩视频| 亚洲精品电影在线| 欧美一区二区视频免费观看| 91传媒视频在线播放| 亚洲成国产人片在线观看| 亚洲日本在线看| 亚洲综合激情网| 亚洲一区二区美女| 午夜影院在线观看欧美| 亚洲综合在线五月| 一区二区三区四区中文字幕| 亚洲欧美日韩国产一区二区三区| 国产日本亚洲高清| 亚洲欧洲av色图| 色综合中文字幕国产| 欧美日韩在线精品一区二区三区激情| 给我免费播放日韩视频| 色呦呦在线资源| 成人免费网站观看| av免费在线免费观看| 三级在线观看视频| 亚洲国产精选| 国产精品久久久久久久久久白浆| 欧美黑人粗大| 国产精品宾馆| 亚洲人成高清| 日韩电影免费在线看| 国产伦精品一区二区三区视频青涩 | 精品视频色一区| 国产丝袜一区二区三区免费视频| 亚洲精品国产福利| 国内精品久久久久久久| 国产精品激情自拍| 免费久久99精品国产自| 国产毛片久久久久久国产毛片| 男女啪啪免费视频网站| 99热在线免费| 国产小视频免费在线网址| 天堂中文av在线资源库| 亚洲精品国产setv| 亚洲一区二区免费看| 99久久综合国产精品| 中文字幕日本不卡| 538在线一区二区精品国产| 最近2019年手机中文字幕| 国产精品盗摄久久久| 中文字幕一区综合| 亚州色图欧美色图| 色综合久久久| 午夜亚洲性色视频| 亚洲综合免费观看高清完整版在线| 亚洲国产精品电影| 99热最新在线| 成人亚洲视频在线观看| 精品极品在线| 欧美体内she精视频在线观看| 国产清纯美女被跳蛋高潮一区二区久久w | 日韩美女中文字幕| 日韩一二区视频| 美女扒开腿让男人桶爽久久软| 综合激情婷婷| 夜色激情一区二区| 欧美性在线观看| 欧美极品欧美精品欧美图片| 中文在线中文资源| 国产自产v一区二区三区c| 欧美日韩综合在线| 91久久精品国产91久久性色tv| 一级在线免费视频| 亚洲三级欧美| 国产精品中文字幕欧美| 欧美精品一区二区三| 综合久久国产| 成人久久网站| 99久久久精品|