范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

MySQLUpdate执行流程解读

  一、update跟踪执行配置
  使用内部程序堆栈跟踪工具path_viewer,跟踪mysql update 一行数据的执行过程,配置执行脚本:call_update.shDROP DATABASE IF EXISTS d1; CREATE DATABASE d1; use d1; drop table if exists test; CREATE TABLE test (c0 int NOT NULL AUTO_INCREMENT,c1 date DEFAULT NULL,c2 time DEFAULT NULL,   c3 datetime DEFAULT NULL,   c4 year DEFAULT NULL,   c5 int DEFAULT NULL,   c6 decimal(10,6) DEFAULT NULL,   c7 double DEFAULT NULL,   c8 float DEFAULT NULL,   c9 varchar(255) DEFAULT NULL,   PRIMARY KEY (c0) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;  INSERT INTO test VALUES ("1", "2021-04-26", "15:36:37", NULL, "2021", NULL, "6.000000", "7.1", "118.169", "a8.168111"); INSERT INTO test VALUES ("2", "2021-04-28", "15:36:37", "2021-04-27 15:36:41", "2021", "6", "7877.126000", "8.1", "119.187", "a9.16"); INSERT INTO test VALUES ("3", "2021-04-29", "15:36:37", "2021-04-27 15:36:41", "2021", "6", "7877.126890", "8.1", "119.187", "a9.1682"); INSERT INTO test VALUES ("4", "2021-04-30", "15:36:37", "2021-04-27 15:36:41", "2021", "6", "7877.126890", "8.1", "119.187", "a9.168333"); EOF  sleep 1  mysql -h127.0.0.1 -P3300 -uroot < my_net_set_read_timeout(NET*, unsigned int)         > vio_timeout(Vio*, unsigned int, int)             > vio_socket_timeout(Vio*, unsigned int, bool)             < vio_socket_timeout(Vio*, unsigned int, bool)         < vio_timeout(Vio*, unsigned int, int)     < my_net_set_read_timeout(NET*, unsigned int)     > dispatch_command(THD*, COM_DATA const*, enum_server_command)         > PROFILING::start_new_query(char const*)         < PROFILING::start_new_query(char const*)         > inline_mysql_refine_statement(PSI_statement_locker*, unsigned int)             > pfs_refine_statement_v2(PSI_statement_locker*, unsigned int)                 > find_statement_class(unsigned int)                 < find_statement_class(unsigned int)             < pfs_refine_statement_v2(PSI_statement_locker*, unsigned int)         < inline_mysql_refine_statement(PSI_statement_locker*, unsigned int)         > THD::set_command(enum_server_command)             > pfs_set_thread_command_vc(int)             < pfs_set_thread_command_vc(int)         < THD::set_command(enum_server_command)         > THD::clear_slow_extended()             > inline_mysql_mutex_unlock(mysql_mutex_t*, char const*, unsigned int)                 > my_mutex_unlock(my_mutex_t*)                     > native_mutex_unlock(pthread_mutex_t*)                     < native_mutex_unlock(pthread_mutex_t*)                 < my_mutex_unlock(my_mutex_t*)             < inline_mysql_mutex_unlock(mysql_mutex_t*, char const*, unsigned int)         < THD::clear_slow_extended() .................................                     < MYSQLparse(THD*, Parse_tree_root**)                     > LEX::make_sql_cmd(Parse_tree_root*)                         > PT_update::make_cmd(THD*)  # 更新流程                             > Parse_context::Parse_context(THD*, Query_block*)                             < Parse_context::Parse_context(THD*, Query_block*)                             > bool (anonymous namespace)::contextualize_safe(Parse_context*, PT_with_clause*)                             < bool (anonymous namespace)::contextualize_safe(Parse_context*, PT_with_clause*)                             > PT_table_factor_table_ident::contextualize(Parse_context*)                                 > Query_block::add_table_to_list(THD*, Table_ident*, char const*, unsigned long, thr_lock_type, enum_mdl_type, List*, List*, MYSQL_LEX_STRING*, Parse_context*)                                     > check_table_name(char const*, unsigned long)                                     < check_table_name(char const*, unsigned long)                                     > memdup_root(MEM_ROOT*, void const*, unsigned long) .................................              > Sql_cmd_dml::execute(THD*)                     > is_timer_applicable_to_statement(THD*)                     < is_timer_applicable_to_statement(THD*)                     > THD::push_internal_handler(Internal_error_handler*)                     < THD::push_internal_handler(Internal_error_handler*)                     > Sql_cmd_dml::prepare(THD*)                         > Sql_cmd_update::precheck(THD*)                             > check_one_table_access(THD*, unsigned long, TABLE_LIST*)                                 > check_single_table_access(THD*, unsigned long, TABLE_LIST*, bool)                                     > check_access(THD*, unsigned long, char const*, unsigned long*, GRANT_INTERNAL_INFO*, bool, bool)                                         > get_cached_schema_access(GRANT_INTERNAL_INFO*, char const*)                                             > ACL_internal_schema_registry::lookup(char const*)                                             < ACL_internal_schema_registry::lookup(char const*) .................................                             < THD::is_dml_gtid_compatible(bool, bool, bool)                         < THD::decide_logging_format(TABLE_LIST*)                     < lock_tables(THD*, TABLE_LIST*, unsigned int, unsigned int)                     > Sql_cmd_update::execute_inner(THD*)                         > Sql_cmd_update::update_single_table(THD*)                             > Query_expression::set_limit(THD*, Query_block*)                                 > Query_block::get_offset(THD*)                                 < Query_block::get_offset(THD*)                                 > Query_block::get_limit(THD*)                                 < Query_block::get_limit(THD*)                             < Query_expression::set_limit(THD*, Query_block*)                             > COPY_INFO::get_function_default_columns(TABLE*)                                 > allocate_column_bitmap(TABLE*, MY_BITMAP**)                                     > multi_alloc_root(MEM_ROOT*, ...)                                     < multi_alloc_root(MEM_ROOT*, ...)                                 < allocate_column_bitmap(TABLE*, MY_BITMAP**)                                 > bitmap_is_clear_all(MY_BITMAP const*)                                 < bitmap_is_clear_all(MY_BITMAP const*) .................................                             > handler::ha_fast_update(THD*, mem_root_deque&, mem_root_deque&, Item*)  # 执行更新                             < handler::ha_fast_update(THD*, mem_root_deque&, mem_root_deque&, Item*)  # 执行更新                              > IndexRangeScanIterator::Read()                                 > QUICK_RANGE_SELECT::get_next()                                     > handler::ha_multi_range_read_next(char**)                                         > ha_innobase::multi_range_read_next(char**) > DsMrr_impl::dsmrr_next(char**)                                                 > handler::multi_range_read_next(char**)                                                     > quick_range_seq_next(void*, KEY_MULTI_RANGE*)                                                     < quick_range_seq_next(void*, KEY_MULTI_RANGE*)                                                     > ha_innobase::read_range_first(key_range const*, key_range const*, bool, bool)                                                         > handler::read_range_first(key_range const*, key_range const*, bool, bool) .................................                              > handler::ha_update_row(unsigned char const*, unsigned char*) # 更新行                                 > handler::mark_trx_read_write()                                 < handler::mark_trx_read_write()                                 > pfs_start_table_io_wait_v1(PSI_table_locker_state*, PSI_table*, PSI_table_io_operation, unsigned int, char const*, unsigned int)                                 < pfs_start_table_io_wait_v1(PSI_table_locker_state*, PSI_table*, PSI_table_io_operation, unsigned int, char const*, unsigned int)                                 > ha_innobase::update_row(unsigned char const*, unsigned char*)                                     > handler::ha_statistic_increment(unsigned long long System_status_var::*) const                                     < handler::ha_statistic_increment(unsigned long long System_status_var::*) const                                     > row_get_prebuilt_update_vector(row_prebuilt_t*)                                         > row_create_update_node_for_mysql(dict_table_t*, mem_block_info_t*)                                             > upd_node_create(mem_block_info_t*)                                                 > mem_heap_zalloc(mem_block_info_t*, unsigned long)                                                     > mem_heap_alloc(mem_block_info_t*, unsigned long)                                                         > mem_block_get_len(mem_block_info_t*)                                                         < mem_block_get_len(mem_block_info_t*)                                                         > mem_block_get_free(mem_block_info_t*)                                                         < mem_block_get_free(mem_block_info_t*)                                                         > mem_block_get_free(mem_block_info_t*)                                                         < mem_block_get_free(mem_block_info_t*)                                                         > mem_block_set_free(mem_block_info_t*, unsigned long)                                                         < mem_block_set_free(mem_block_info_t*, unsigned long)                                                     < mem_heap_alloc(mem_block_info_t*, unsigned long)                                                 < mem_heap_zalloc(mem_block_info_t*, unsigned long)                                                 > mem_heap_create_func(unsigned long, unsigned long) .................................                                                  > __gnu_cxx::__exchange_and_add(int volatile*, int)                                                 < __gnu_cxx::__exchange_and_add(int volatile*, int)                                             < __gnu_cxx::__exchange_and_add_dispatch(int*, int)                                         < QUICK_RANGE_SELECT::~QUICK_RANGE_SELECT()                                     < QUICK_RANGE_SELECT::~QUICK_RANGE_SELECT()                                 < QEP_shared_owner::qs_cleanup()                             < QEP_TAB::cleanup()                         < Sql_cmd_update::update_single_table(THD*)                     < Sql_cmd_update::execute_inner(THD*)                     > THD::pop_internal_handler()                     < THD::pop_internal_handler()                     > Query_expression::cleanup(THD*, bool)                         > Query_block::cleanup(THD*, bool)                         < Query_block::cleanup(THD*, bool)                     < Query_expression::cleanup(THD*, bool) 二、执行分析主要过程函数 do_command(THD*)      --从连接中读取命令 dispatch_sql_command   --分发命令 THD::sql_parser()      --SQL引擎层,词法语法分析   parse_sql       --SQL转换为AST语句     LEX::make_sql_cmd(Parse_tree_root*)  --解析树翻译成AST语法树      PT_update::make_cmd(THD*)   --更新树节点翻译成AST语法树       mysql_execute_command   --命令执行   Sql_cmd_dml::execute     Sql_cmd_dml::prepare(THD*)  --引用消解      Sql_cmd_update::precheck(THD*)  --更新语句实际执行的引用消解  Sql_cmd_update::execute_inner(THD*)  --SQL引擎层,调用存储引擎接口执行   Sql_cmd_update::update_single_table(THD*)   optimize_cond  --执行优化器优化路径    handler::ha_fast_update  ha_innobase::update_row   --innodb更新buffer pool 中table 的row trans_commit_stmt(THD*, bool) innoDB关键更新执行过程 ha_innobase::update_row: row_get_prebuilt_update_vector calc_row_difference row_update_for_mysql  row_upd_step    row_upd   --执行更新     btr_pcur_t::restore_position     rec_get_offsets_func     btr_cur_update_in_place     btr_cur_upd_lock_and_undo     trx_undo_report_row_operation     trx_undo_create     trx_undo_seg_create      _fil_io      Fil_shard::do_io      pfs_os_aio_func     mtr_t::Command::execute      log_buffer_reserve      mtr_t::Command::add_dirty_blocks_to_flush_list ---脏数据快准备刷入磁盘     trx_undo_page_report_modify row_upd_rec_sys_fields  row_upd_rec_in_place btr_cur_update_in_place_log
  更新过程描述:
  InnoDB 存储引擎,当更新一条数据时,会先更新 buffer pool 中的数据,Master Thread 刷新缓冲池中的脏页数据到磁盘中;更新一条记录前,会先生成一条undolog,记录更新操作,再生成redolog;事务提交时,将事务生成的redolog刷入磁盘。 三、执行总结update执行流程1.执行语句连接数据库 2.分析器通过词法、语法分析知道这是一条更新语句 3.优化器确定执行路径 4.执行器具体执行,找到这一行,更新数据,然后通过Inodb存储具体更新操作 5.InnoDB 存储引擎更新内存数据后写入磁盘,过程中会更新各个日志文件binlog、undolog、redolog

广西玉林浩杰新能源科技有限公司召回部分电动自行车充电器日前,广西玉林浩杰新能源科技有限公司按照消费品召回管理暂行规定的要求,主动向广西壮族自治区市场监督管理局报告了召回计划,将自即日起,召回生产批号批次为20200706规格分别为48无人驾驶汽车有望持牌上路!这些公司称已经布局无人驾驶正在加速驶向现实。5月27日,智能网联汽车传来重大进展无人驾驶汽车有望在深圳合法上路了!27日,深圳经济特区智能网联汽车管理条例(草案)(以下简称草案)提请深圳市七届人大常128GB的新手机不建议入手?知道这三个细节,会少走很多弯路几年来科技进步越来越快,特别是手机方面,更新换代非常快,不管是性能还是外观,手机品牌的多样化和多元化让我们有了更多选择!而手机的竞争力也非常大!就比如现在,小编个人建议入手128G麻烦问下cpue31230v3,显卡gtx960为什么打英雄联盟团战掉帧到50?要么显卡没打驱动要么显卡是黄伟达我是e3v5卖了自己的58835捡漏了一个伊拉克成色的gts250全高1080打团都有80帧显卡驱动的问题吧,我e3加r9290x都没这么掉过你描述一个时代的终结!别了,微软IE浏览器据道琼斯旗下新闻网站MarketWatch报道,曾经端坐霸主地位的微软IE浏览器在走过20多年的岁月后,最终与互联网时代早期被淘汰的品牌一样,即将退出历史。微软公司5月19日宣布,第五届世界智能大会智能科技展正式开放观众争相体验智能互动5月22日,第五届世界智能大会智能科技展正式向公众开放。体验区内,观众们争相参与各种智能互动体验。走进梅江会展中心,就看到迎面而来的机器人热情地和大家打招呼。一旁的互动体验区也排着5G消息第15期行业动态(517523)这是新5G消息公众号为大家整理的第15期5G消息行业动态!1政府机构协会等官方动态工作组首次理事会召开5月20日,5G消息工作组在厦门召开首次理事(候选)单位座谈会。本次会议完成了盖茨为何与爱泼斯坦交往颇深?美媒为了他在世界上最想要的东西美国每日野兽网站18日发表文章称,微软联合创始人比尔盖茨喜欢在后来被定罪的性侵犯杰弗里爱泼斯坦位于曼哈顿的豪宅里与人交谈,据称他是为了从自己的婚姻当中抽身,并与爱泼斯坦宴请的宾客谈雷军赞不绝口,老罗花样推荐,聊聊风靡全球的电动螺丝刀今天先给大家玩一个无限套娃。日前,充电头网发布了一条微博中年男子的真实写照,你也是这样的么?配图如上一个游戏论坛的博主在论坛看遍世间万象,发现还有人沉迷充电头。头网的微博评论区立刻补贴新政出台!续航250公里以下无补贴,最高补贴仅2。5万3月26日,财政部官方网站公布了关于进一步完善新能源汽车推广应用财政补贴政策的通知(财建2019138号)。至此,在经过多轮热议后,新能源汽车补贴政策调整方案终于落定。关于乘用车的华为P30P30Pro正式发布4000万像素摄像头10倍混合变焦经过大约一个月的连续泄密,华为终于在巴黎的发布会活动上宣布了其新旗舰P30和P30Pro手机。正如您所期望的那样,这两款手机都配备了华为自产麒麟980芯片组,该芯片组也被用于Mat
阿里女员工愤怒,再次认识残酷的现实阿里女员工不公事件,再次践踏了底层群众的底线。冷静下来,阿里都如此,其他不如阿里的会比阿里高尚?还是阿段厉害,从二选一就品出了价值观,不是让天下没有难做的生意,而是在朕的天下没有难现在已经很少有非智能电视了,能否把智能电视刷成非智能电视?1,电脑显示器。2,打开电视后盖,如果是三块主板的,就直接把中间的电脑板扔了,信号直接给驱动板。如果只有一块,那就是三合一主板,直接扔了,自己买一块驱动板一块电源板插上就好。3,以壕无人性!王思聪百万电脑跑分亚洲第一,全球第四近日,撕聪邀请哔哩哔哩UP电丸科技配合安装了一台家用服务器,调试跑了下分,居然高达全球第四!网友调侃道这台配置如下储存与计算服务器型号DellR7525(拨号和网络服务器R740)二本4年经验,历经Android研发4面,成功跳进阿里,获60wOffer!7月初准备跳槽,先后面试了各大小公司,拿了一些offer,有阿里,滴滴,快手,达达,得物等公司。面试的公司大部分都能过,所以这里给大家分享下自己的经验,也给自己做个归档,希望能给正青少年模式侵犯未成年权益遭起诉?腾讯微信再迎整改网络热点年年有,今年尤其多。这不,腾讯又双叒叕摊上事儿了。近期,腾讯或被提起民事公益诉讼一事闹得沸沸扬扬。作为一家游戏巨头,腾讯暴利的游戏业务常常引发关于青少年教育问题的全民讨论。一台出色的2。0系统桌面音箱的多面性,创新T60初体验在笔者的心中,创新这个品牌绝对是桌面音箱领域里yyds,想当年攒得第一台电脑所花的钱,就有四分之一用来入手创新音箱,那时候高配置的电脑装机清单里,也总少不了有创新音箱。这么多年过去成中移动5G模组招标最大赢家,高通骁龙能力再获认可8月5日,中国移动公布2021年至2022年5G通用模组产品集中采购中标侯选人。据悉,本次招标总采购量为32万片,为目前国内运营商规模最大的5G产品集采项目,有助于推动5G普及5G为什么要进行职业教育改革?就是要解决有学历没技能的痛点液压式伺服冲压机扫描透射电子全息显微镜加氢反应器电波暗室这是我国尚未掌握的核心技术清单。而这只是我们国家卡脖子技术的一部分。在日前举办的第七届产教融合发展战略国际论坛上,一份当前我荣耀平板V7Pro也有平行视界,还能一屏四用IT之家8月10日消息荣耀此前官宣了荣耀平板V7Pro将与Magic3系列等一起在8月12日发布,该机将首发搭载联发科最新发布的迅鲲1300T芯片。今日,荣耀官方又发布宣传视频,这想体验真正的全面屏?那还得看中兴Axon30屏下版手机中国行情在大家现在对手机的审美中,手机的屏占比越高越好看,全面屏已经成为了手机行业的发展潮流,越来越多的消费者对屏幕顶端的刘海挖孔设计不满意。在全面屏手机这一块,中兴可以说是走173页Docker学习笔记,内容详尽讲解细致,仅分享三天如今Docker的使用已经非常普遍,特别在一线互联网公司。使用Docker技术可以帮助企业快速水平扩展服务,从而到达弹性部署业务的能力。在云服务概念兴起之后,Docker的使用场景