這篇文章主要介紹“MySQL中sending data狀態(tài)包含了什么”,在日常操作中,相信很多人在MySQL中sending data狀態(tài)包含了什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對(duì)大家解答”MySQL中sending data狀態(tài)包含了什么”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!
站在用戶的角度思考問題,與客戶深入溝通,找到吳江網(wǎng)站設(shè)計(jì)與吳江網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、空間域名、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋吳江地區(qū)。
原問題如下:
數(shù)據(jù)庫發(fā)送數(shù)據(jù)給客戶端這個(gè)時(shí)間算是sql的執(zhí)行時(shí)間嘛?
要解決問題我們需要知道MySQL何時(shí)將數(shù)據(jù)傳輸給了客戶端,既然是要傳輸實(shí)際的數(shù)據(jù)給客戶端那么肯定是select語句了,同時(shí)我們要明白一個(gè)正常select運(yùn)行到底要經(jīng)歷哪些階段。
2392 T@10: | | | | | THD::enter_stage: 'checking permissions' /root/mysql5.7.14/percona-server-5.7.14-7/sql/auth/sql_authorization.cc:843 2404 T@10: | | | | | | THD::enter_stage: 'Opening tables' /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_base.cc:5719 2512 T@10: | | | | | THD::enter_stage: 'init' /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_select.cc:121 2681 T@10: | | | | | | | THD::enter_stage: 'System lock' /root/mysql5.7.14/percona-server-5.7.14-7/sql/lock.cc:321 2772 T@10: | | | | | | | THD::enter_stage: 'optimizing' /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_optimizer.cc:151 2865 T@10: | | | | | | | THD::enter_stage: 'statistics' /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_optimizer.cc:386 3329 T@10: | | | | | | | THD::enter_stage: 'preparing' /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_optimizer.cc:494 3466 T@10: | | | | | | THD::enter_stage: 'executing' /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_executor.cc:119 3474 T@10: | | | | | | THD::enter_stage: 'Sending data' /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_executor.cc:195 3668 T@10: | | | | | THD::enter_stage: 'end' /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_select.cc:199 3685 T@10: | | | | THD::enter_stage: 'query end' /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_parse.cc:5174 3754 T@10: | | | | THD::enter_stage: 'closing tables' /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_parse.cc:5252 3882 T@10: | | | THD::enter_stage: 'freeing items' /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_parse.cc:5855
實(shí)際上整個(gè)階段都算到了語句的實(shí)際消耗時(shí)間之中的,但是慢查詢記錄的是:
實(shí)際執(zhí)行時(shí)間 = (freeing items 末端的時(shí)間) 實(shí)際消耗時(shí)間 - (System lock末端的時(shí)間 )比如MDL LOCK等待時(shí)間 - (Innodb層鎖定的時(shí)間)行鎖等待消耗時(shí)間
關(guān)于慢查詢的詳細(xì)情況可以參考我的一篇文章,這里不再重述。
實(shí)際上這個(gè)狀態(tài)是select語句才會(huì)有的,如果是DML則不同但是都有等同的階段如下:
select:Sending data
insert語句:Update
delete/update:Updating
這個(gè)階段非常的巨大,它至少包含了:
Innodb 層數(shù)據(jù)的定位返回給MySQL 層
Innodb 層數(shù)據(jù)的查詢返回給MySQL 層
Innodb 層數(shù)據(jù)的修改(如果是MDL)
Innodb 層加鎖以及等待
等待進(jìn)入Innodb層(innodb_thread_concurrency參數(shù))
MySQL 層發(fā)送數(shù)據(jù)給客戶端
可以看到基本所有和Innodb層打交道的過程都包裹在這個(gè)狀態(tài)下面,當(dāng)然我只是列舉了我想到的一些,其實(shí)可能還有很多很多,這里我也把 MySQL 層發(fā)送數(shù)據(jù)給客戶端包含在 Sending data的答案給出了,下面我們進(jìn)行分析。
之前你可以參考一下我的文章
我們建立一個(gè)簡單的表如下,并且填充數(shù)據(jù)如下:
Create Table: CREATE TABLE `ty` ( `id` int(11) NOT NULL AUTO_INCREMENT, `a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `idxa` (`a`) ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 mysql> select * from ty; +----+------+------+| id | a | b |+----+------+------+| 8 | 2 | 3 || 9 | 5 | 4 || 10 | 6 | 7 || 11 | 6 | 8 |+----+------+------+4 rows in set (4.14 sec)
我們執(zhí)行如下語句:
mysql> desc select * from ty where a =6 and b=8; +----+-------------+-------+------------+------+---------------+------+---------+-------+------+----------+-------------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+------+---------------+------+---------+-------+------+----------+-------------+ | 1 | SIMPLE | ty | NULL | ref | idxa | idxa | 5 | const | 2 | 33.33 | Using where |+----+-------------+-------+------------+------+---------------+------+---------+-------+------+----------+-------------+ mysql> select * from ty where a =6 and b=8; +----+------+------+| id | a | b |+----+------+------+| 11 | 6 | 8 |+----+------+------+1 row in set (7.22 sec)
注意:這里的語句執(zhí)行時(shí)間很長是因?yàn)槲掖蛄薌DB斷點(diǎn)所以看起來很久而已
我做了語句的trace,這個(gè)語句大概需要如下步驟:
首先Innodb定位到索引 idxa
數(shù)據(jù)6所在位置這是初次定位調(diào)用函數(shù)ha_innobase::index_read,返回?cái)?shù)據(jù)| 10 | 6 | 7 |給MySQL層,但是MySQL層過濾掉不符合條件 a =6 and b=8 不需要返回給客戶端。
1547 T@12: | | | | | | | | >handler::ha_index_read_map 1548 T@12: | | | | | | | | | >index_read (這里進(jìn)行初次訪問索引定位) 1552 T@12: | | | | | | | | | | >row_search_mvcc 1553 T@12: | | | | | | | | | | | >btr_cur_search_to_nth_level 1554 T@12: | | | | | | | | | | | <btr_cur_search_to_nth_level 2009 ... 1593 T@12: | | | | | | | | | | <row_search_mvcc 6070 1594 T@12: | | | | | | | | | <index_read 9179 1595 T@12: | | | | | | | | <handler::ha_index_read_map 3190 1596 T@12: | | | | | | | | >evaluate_join_record (這里進(jìn)入MySQL 層where條件判斷流程,不滿足不發(fā)送) ... 1600 T@12: | | | | | | | | <evaluate_join_record 1701
定位完成后再次訪問索引 idxa
的下一條數(shù)據(jù),Innodb直接讀取就好了調(diào)用函數(shù)ha_innobase::index_next_same,返回?cái)?shù)據(jù)| 11 | 6 | 8 |給Mysql層,因?yàn)闈M足條件 a =6 and b=8 所以返回給客戶端
。
1601 T@12: | | | | | | | | >handler::ha_index_next_same(這里就是順序訪問索引的下一行數(shù)據(jù)了) 1602 T@12: | | | | | | | | | >general_fetch 1603 T@12: | | | | | | | | | | >row_search_mvcc .... 1607 T@12: | | | | | | | | | | <row_search_mvcc 6070 1608 T@12: | | | | | | | | | <general_fetch 9487 1609 T@12: | | | | | | | | <handler::ha_index_next_same 3414 1610 T@12: | | | | | | | | >evaluate_join_record(這里進(jìn)入MySQL 層where條件判斷流程,滿足條件需要發(fā)送) 1613 T@12: | | | | | | | | | >end_send 1614 T@12: | | | | | | | | | | >Query_result_send::send_data(這里就是發(fā)送數(shù)據(jù)給客戶端了,也就是通過網(wǎng)絡(luò)發(fā)送數(shù)據(jù)給客戶端了) 1615 T@12: | | | | | | | | | | | >send_result_set_row 1616 T@12: | | | | | | | | | | | <send_result_set_row 4967 1620 T@12: | | | | | | | | | | <Query_result_send::send_data 2915 1621 T@12: | | | | | | | | | | >Protocol_classic::end_row 1622 T@12: | | | | | | | | | | <Protocol_classic::end_row 1198 1625 T@12: | | | | | | | | | <end_send 2991 1626 T@12: | | | | | | | | <evaluate_join_record 1701
因?yàn)槭欠俏ㄒ凰饕虼诵枰俅卧L問下一條數(shù)據(jù)來判斷已經(jīng)讀取了所有a=6的數(shù)據(jù),因此Innodb需要在讀取索引 idxa
的下一條數(shù)據(jù)調(diào)用函數(shù)ha_innobase::index_next_same。
1627 T@12: | | | | | | | | >handler::ha_index_next_same(這里就是順序訪問索引的下一行數(shù)據(jù)了) 1628 T@12: | | | | | | | | | >general_fetch 1629 T@12: | | | | | | | | | | >row_search_mvcc ... 1639 T@12: | | | | | | | | | | <row_search_mvcc 6070 1640 T@12: | | | | | | | | | <general_fetch 9487 1641 T@12: | | | | | | | | <handler::ha_index_next_same 3414
所以總結(jié)整個(gè)流程一共經(jīng)歷了一次索引定位,兩次索引順序讀取,一共讀取了三條數(shù)據(jù),但是返回給MySQL層的只有前面兩條數(shù)據(jù),通過MySQL層的過濾只發(fā)送給了客戶端一條滿足條件的數(shù)據(jù)。
到此,關(guān)于“MySQL中sending data狀態(tài)包含了什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
本文標(biāo)題:MySQL中sendingdata狀態(tài)包含了什么
URL地址:http://www.rwnh.cn/article8/gpooip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設(shè)、定制開發(fā)、外貿(mào)建站、用戶體驗(yàn)、全網(wǎng)營銷推廣、自適應(yīng)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)