日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql源码_MySql轻松入门系列——第一站 从源码角度轻松认识mysql整体框架图

發(fā)布時(shí)間:2024/9/27 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql源码_MySql轻松入门系列——第一站 从源码角度轻松认识mysql整体框架图 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一:背景

1. 講故事

最近看各大技術(shù)社區(qū),不管是知乎,掘金,博客園,csdn基本上看不到有小伙伴分享sqlserver類的文章,看來在國內(nèi)大環(huán)境下是不怎么流行了,看樣子我再寫sqlserver是不可能再寫了,這輩子都不會寫了,只能靠技術(shù)輸出mysql維持生活這樣子。

二:了解架構(gòu)圖

mysql最大的好處就是開源, 手握百萬源碼,有什么問題搞不定呢? 這一點(diǎn)要比sqlserver爽多了,不用再dbcc搗來搗去。

1. 從架構(gòu)圖入手

大家都知道做/裝修房子都要有一張圖紙,其實(shí)軟件也是一樣,只要有了這么一張圖紙,大方向就定下來了,再深入到細(xì)節(jié)也不會亂了方向,然后給大家看一下我自己畫的架構(gòu)圖,畫的不對請輕拍。

其實(shí)SqlServer,Oracle,MySql架構(gòu)都大同小異,MySql的鮮明特點(diǎn)就是存儲引擎做成了插拔式,這就牛逼了,現(xiàn)行最常用的是InnoDB,這就讓我有了一個(gè)想法,有一套業(yè)務(wù)準(zhǔn)備用 InMemory 模式跑一下,厲害了~~~

2. 功能點(diǎn)介紹

MySql其實(shí)就兩大塊,一塊是MySql Server層,一塊就是Storage Engines層。

<1> Client

不同語言的sdk遵守mysql協(xié)議就可以與mysqld進(jìn)行互通。

<2> Connection/Thread Pool

MySql使用C++編寫,Connection是非常寶貴的,在初始化的時(shí)候維護(hù)一個(gè)池。

<3> SqlInterface,Parse,Optimizer,Cache

對sql處理,解析,優(yōu)化,緩存等處理和過濾模塊,了解了解即可。

<4> Storage Engines

負(fù)責(zé)存儲的模塊,官方,第三方,甚至是你自己都可以自定義實(shí)現(xiàn)這個(gè)數(shù)據(jù)存儲,這就把生態(tài)做起來了,🐮👃。

三: 源碼分析

關(guān)于怎么去下載mysql源碼,這里就不說了,大家自己去官網(wǎng)搗鼓搗鼓哈,本系列使用經(jīng)典的 mysql 5.7.14版本。

1. 了解mysql是如何啟動監(jiān)聽的

手握百萬行源碼,怎么找入口函數(shù)呢??? 😁😁😁,其實(shí)很簡單,在mysqld進(jìn)程上生成一個(gè)dump文件,然后看它的托管堆不就好啦。。。

從圖中可以看到,入口函數(shù)就是 mysqld!mysqld_main+0x227 中的 mysqld_main, 接下來就可以在源碼中全文檢索下。

<1> mysqld_main 入口函數(shù) => sql/main.cc

extern int mysqld_main(int argc, char **argv);

int main(int argc, char **argv)

{

return mysqld_main(argc, argv);

}

這里大家可以用visualstudio打開C++源碼,使用查看定義功能,非常好用。

<2> 創(chuàng)建監(jiān)聽

int mysqld_main(int argc, char **argv)

{

//創(chuàng)建服務(wù)監(jiān)聽線程

handle_connections_sockets();

}

void handle_connections_sockets()

{

//監(jiān)聽連接

new_sock= mysql_socket_accept(key_socket_client_connection, sock,

(struct sockaddr *)(&cAddr), &length);

if (mysql_socket_getfd(sock) == mysql_socket_getfd(unix_sock))

thd->security_ctx->set_host((char*) my_localhost);

//創(chuàng)建連接

create_new_thread(thd);

}

//創(chuàng)建新線程處理處理用戶連接

static void create_new_thread(THD *thd){

thd->thread_id= thd->variables.pseudo_thread_id= thread_id++;

//線程進(jìn)了線程調(diào)度器

MYSQL_CALLBACK(thread_scheduler, add_connection, (thd));

}

至此mysql就開啟了一個(gè)線程對 3306 端口進(jìn)行監(jiān)控,等待客戶端請求觸發(fā) add_connection 回調(diào)。

2. 理解mysql是如何處理sql請求

這里我以Insert操作為例稍微解剖下處理流程:

當(dāng)用戶有請求sql過來之后,就會觸發(fā) thread_scheduler的回調(diào)函數(shù)add_connection。

static scheduler_functions one_thread_per_connection_scheduler_functions=

{

0, // max_threads

NULL, // init

init_new_connection_handler_thread, // init_new_connection_thread

create_thread_to_handle_connection, // add_connection

NULL, // thd_wait_begin

NULL, // thd_wait_end

NULL, // post_kill_notification

one_thread_per_connection_end, // end_thread

NULL, // end

};

從 scheduler_functions 中可以看到,add_connection 對應(yīng)了 create_thread_to_handle_connection,也就是請求來了會觸發(fā)這個(gè)函數(shù),從名字也可以看出,用一個(gè)線程處理一個(gè)用戶連接。

<1> 客戶端請求被 create_thread_to_handle_connection 接管及調(diào)用棧追蹤

void create_thread_to_handle_connection(THD *thd)

{

if ((error= mysql_thread_create(key_thread_one_connection, &thd->real_id, &connection_attrib,

handle_one_connection,(void*) thd))){}

}

//觸發(fā)回調(diào)函數(shù) handle_one_connection

pthread_handler_t handle_one_connection(void *arg)

{

do_handle_one_connection(thd);

}

//繼續(xù)處理

void do_handle_one_connection(THD *thd_arg){

while (thd_is_connection_alive(thd))

{

mysql_audit_release(thd);

if (do_command(thd)) break; //這里的 do_command 繼續(xù)處理

}

}

//繼續(xù)分發(fā)

bool do_command(THD *thd)

{

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

}

bool dispatch_command(enum enum_server_command command, THD *thd, char* packet, uint packet_length)

{

switch (command) {

case COM_INIT_DB: .... break;

...

case COM_QUERY: //查詢語句: insert xxxx

mysql_parse(thd, thd->query(), thd->query_length(), &parser_state); //sql解析

break;

}

}

//sql解析模塊

void mysql_parse(THD *thd, char *rawbuf, uint length, Parser_state *parser_state)

{

error= mysql_execute_command(thd);

}

<2> 到這里它的Parse,Optimizer,Cache都追完了,接下來看sql的CURD類型,繼續(xù)追。。。

//繼續(xù)執(zhí)行

int mysql_execute_command(THD *thd)

{

switch (lex->sql_command)

{

case SQLCOM_SELECT: res= execute_sqlcom_select(thd, all_tables); break;

//這個(gè) insert 就是我要追的

case SQLCOM_INSERT: res= mysql_insert(thd, all_tables, lex->field_list, lex->many_values,

lex->update_list, lex->value_list,

lex->duplicates, lex->ignore);

}

}

//insert插入操作處理

bool mysql_insert(THD *thd,TABLE_LIST *table_list,List &fields, List &values_list,

List &update_fields, List &update_values,

enum_duplicates duplic, bool ignore)

{

while ((values= its++))

{

error= write_record(thd, table, &info, &update);

}

}

//寫入記錄

int write_record(THD *thd, TABLE *table, COPY_INFO *info, COPY_INFO *update)

{

if (duplicate_handling == DUP_REPLACE || duplicate_handling == DUP_UPDATE)

{

// ha_write_row 重點(diǎn)是這個(gè)函數(shù)

while ((error=table->file->ha_write_row(table->record[0])))

{

....

}

}

}

可以看到,調(diào)用鏈還是挺深的,追到 ha_write_row 方法基本上算是追到頭了,再往下的話就是 MySql Server 給 Storage Engine提供的接口實(shí)現(xiàn)了,不信的話繼續(xù)看唄。。。

<3> 繼續(xù)挖 ha_write_row

int handler::ha_write_row(uchar *buf)

{

MYSQL_TABLE_IO_WAIT(m_psi, PSI_TABLE_WRITE_ROW, MAX_KEY, 0,{ error= write_row(buf); })

}

//這是一個(gè)虛方法

virtual int write_row(uchar *buf __attribute__((unused)))

{

return HA_ERR_WRONG_COMMAND;

}

看到?jīng)]有,write_row是個(gè)虛方法,也就是給底層方法實(shí)現(xiàn)的,在這里就是給各大Storage Engines的哈。😁😁😁

3. 調(diào)用鏈圖

這么多方法,看起來有點(diǎn)懵懵的吧,我來畫一張圖,幫助大家理解下這個(gè)調(diào)用堆棧。

三:總結(jié)

大家一定要熟讀架構(gòu)圖,有了架構(gòu)圖從源碼中找信息就方便多了,總之學(xué)習(xí)mysql成就感還是滿滿的😁。

如您有更多問題與我互動,掃描下方進(jìn)來吧~

總結(jié)

以上是生活随笔為你收集整理的mysql源码_MySql轻松入门系列——第一站 从源码角度轻松认识mysql整体框架图的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 中文字幕亚洲一区二区三区 | 激情一级片 | 久久无毛| 国产富婆一级全黄大片 | 99久久精品免费看国产 | 日本一级淫片 | 动漫av一区 | 欢乐谷在线观看免费播放高清 | 亚洲网站免费 | 午夜两性| 小视频在线看 | 久久99精品久久久久久国产越南 | 亚洲高清免费视频 | 一级精品视频 | 正在播放老肥熟妇露脸 | 双性人bbww欧美双性 | 亚洲视频图片小说 | 日韩精品高清在线观看 | 成人精品二区 | 综合久久一区二区 | 91直接看| 久久久网址 | 双性人妖互交localhost | 黄色av小说在线观看 | 欧美一级片观看 | 久久无码精品丰满人妻 | 激情六月天婷婷 | 好看的黄色网址 | 欧美一级α片 | 欧美性受xxx | 欧美肥老妇| 91丨porny丨在线中文 | 日韩欧美视频一区二区三区 | 免费日本视频 | 牛牛av | 国产视频久久久久久久 | 东北少妇高潮抽搐 | 疯狂揉花蒂控制高潮h | 成人网战 | 东北少妇露脸无套对白 | 国产又粗又猛又爽又黄av | 91社区福利 | 欧洲色网 | 免看一级片 | 妹子干综合网 | 国产男人的天堂 | 精久久久久久 | 美女毛片在线观看 | 免费成人美女女 | 欧美一级黄色大片 | 国产内射合集颜射 | 国产人妖ts重口系列网站观看 | 网站色| 少妇捆绑紧缚av | 欧美综合另类 | 天天干天天干天天 | 13日本xxxxxⅹxxx20 | 6080福利 | 免费av网站大全 | 黑人一级黄色片 | 中文字幕在线观看 | 国产在线一级 | 草的我好爽 | 四虎成人永久免费视频 | 国产精品原创 | www.4虎| 麻豆亚洲av熟女国产一区二 | 午夜欧美福利 | 亚洲一区二区三区国产 | 99久久久国产精品无码网爆 | 99国产精品一区二区三区 | 亚洲色吧 | 久久久久久久久久久97 | 男人的天堂avav | 美国三级视频 | 免费观看国产精品视频 | 老女人毛片50一60岁 | 午夜影视av | 亚洲 欧美 激情 小说 另类 | 欧美激情一区二区三区四区 | 色婷在线 | 黄色小视频在线看 | 欧美成人图区 | 欧美国产一二三区 | 理论片一区 | 丝袜人妖 | 国产在线第二页 | 国产aⅴ无码片毛片一级一区2 | 欧美久久久久久久久中文字幕 | 黄色大全免费看 | 欧美在线视频免费观看 | 超碰在线观看91 | 久久成人a毛片免费观看网站 | 93久久精品日日躁夜夜躁欧美 | 国产精品丝袜在线观看 | 欧美a级片在线观看 | 男男play视频 | 欧美日韩激情在线观看 | 非洲黑人毛片 |