mysql的啟動過程詳解
有一天,兩個不懂mysql內核的人想去了解mysql內核代碼,兩個人不是去調試代碼、查找資料,而是在那邊思考。因為不了解內核,所以邊思考邊去驗證。
使用的mysql代碼是5.1.7,調試環(huán)境是windows平臺下的vs2003。
Bingxi:“alex,你覺得mysql的啟動過程會是什么樣的呢?我們以銀行為例吧?!?br />
Alex:“嗯,bingxi。早上銀行開門了,會先準備好環(huán)境,然后開門迎客,mysql也是這樣。Mysql里面會有一個handle_connections_sockets函數(shù),這個函數(shù)就好比是個叫號機,每個用戶來了都會取個號,然后就會進行業(yè)務處理。”
{
……
while (!abort_loop)
{
select((int) max_used_connection,&readFDs,0,0,0) < 0) //有連接了則往下來執(zhí)行,否則一直等待
……
accept(sock, my_reinterpret_cast(struct sockaddr *) (&cAddr),&length) //接受請求
……
create_new_thread(thd);
}
//abort_loop=1,則執(zhí)行到這里進行推出。今天業(yè)務不處理了
}
Bingxi:“啊,這里面存在兩種可能的,1)用戶來一個就分配一個工作人員處理,2)將排號的人丟進工作隊列,根據叫號機到指定窗口獲取服務。前者的場景適合于請求量大,并且需要響應速度特別快的情況,但是分配也會有個限制,所謂的最大連接數(shù),這樣的情況常見于互聯(lián)網行業(yè),相應地我們可以看到機器的負載變化范圍特別大。同樣的,這也是它的一個弊端,假設每個業(yè)務都復雜(消耗資源型sql語句),同時處理的話,機器會支撐不住,這時候第二種方法就比較好,這種情況屬于事務性場景?!?/p>
Alex:“嗯,是的。Mysql選擇的是前者,oracle提供兩種方法供選擇。我們繼續(xù)往下面的代碼看,如果我們配置了線程緩存,且有可用的緩存,則喚醒該線程,否則創(chuàng)建新的線程?!?br />
static void create_new_thread(THD *thd)
{
if (cached_thread_count > wake_thread)
{
start_cached_thread(thd);
}
else
{
if ((error=pthread_create(&thd->real_id,&connection_attrib,
handle_one_connection,
(void*) thd)))
}
}
Bingxi:“嗯,老楊。是不是理解銀行為客戶分配了一個服務人員,在這段期間一直為該客戶服務。里面有個代碼段,是一直在等用戶下命令。但是有可能網絡,或者被kill掉了,就像一個人存了100,不斷取1塊錢一樣,被保安帶走了。”
pthread_handler_t handle_one_connection(void *arg)
{
while (!net->error && net->vio != 0 &&
!(thd->killed == THD::KILL_CONNECTION))
{
net->no_send_error= 0;
if (do_command(thd))
break;
}
}
Alex:“嗯,獲取命令,然后執(zhí)行命令。在dispatch_command函數(shù)中,根據不同的客戶請求進行響應的處理,比如開賬戶、存錢等”
bool do_command(THD *thd)
{
if ((packet_length=my_net_read(net)) == packet_error) //獲取命令
DBUG_RETURN(dispatch_command(command,thd, packet+1, (uint) packet_length));
}
相關文章
SQL HAVING子句在GROUP BY中的條件篩選靈活運用
這篇文章主要為大家介紹了SQL HAVING子句在GROUP BY中的條件篩選靈活運用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11MySQL系列之五 視圖、存儲函數(shù)、存儲過程、觸發(fā)器
視圖就是一條select語句執(zhí)行后返回的結果集;觸發(fā)器是與表有關的數(shù)據庫對象,在滿足定義條件時觸發(fā),并執(zhí)行觸發(fā)器中定義的語句集合;函數(shù)存儲著一系列sql語句,調用函數(shù)就是一次性執(zhí)行這些語句,而存儲過程就是一組可編程的函數(shù),需要的朋友可以參考下2021-07-07MySQL一個語句查出各種整形占用字節(jié)數(shù)及最大最小值的實例
下面小編就為大家?guī)硪黄狹ySQL一個語句查出各種整形占用字節(jié)數(shù)及最大最小值的實例。2017-03-03